Skip to content

Commit ea705c5

Browse files
author
Daniel Shiplett
committed
Issue 21 - Add option to disable Lazy annotation and write test to cover
successful loading of Context in simple-springboot example.
1 parent 56e0df7 commit ea705c5

File tree

9 files changed

+59
-3
lines changed

9 files changed

+59
-3
lines changed

annotations/src/main/java/org/mapstruct/extensions/spring/SpringMapperConfig.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,12 @@
3737
* @return The bean name for the Spring {@link org.springframework.core.convert.ConversionService}.
3838
*/
3939
String conversionServiceBeanName() default "";
40+
41+
/**
42+
* To set if the Lazy annotation will be added to the
43+
* ConversionService's usage in the ConversionServiceAdapter. Defaults to true.
44+
*
45+
* @return true to add the Lazy annotation
46+
*/
47+
boolean lazyAnnotatedConversionServiceBean() default true;
4048
}

examples/simple-springboot/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ dependencies {
1111
implementation 'org.mapstruct:mapstruct:1.4.0.Final'
1212
annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.0.Final'
1313
implementation 'org.springframework.boot:spring-boot-starter'
14+
testImplementation 'org.springframework.boot:spring-boot-starter-test:2.4.4'
1415
}

examples/simple-springboot/src/main/java/org/mapstruct/extensions/spring/example/boot/Start.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package org.mapstruct.extensions.spring.example.boot;
22

3-
import org.mapstruct.extensions.spring.converter.ConversionServiceAdapter;
43
import org.mapstruct.extensions.spring.example.Car;
54
import org.mapstruct.extensions.spring.example.CarDto;
65
import org.mapstruct.extensions.spring.example.SeatConfiguration;
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package org.mapstruct.extensions.spring.example.boot.mappers;
22

33
import org.mapstruct.MapperConfig;
4-
import org.mapstruct.extensions.spring.converter.ConversionServiceAdapter;
4+
import org.mapstruct.extensions.spring.SpringMapperConfig;
5+
import org.mapstruct.extensions.spring.example.boot.ConversionServiceAdapter;
56

67
@MapperConfig(componentModel = "spring", uses = ConversionServiceAdapter.class)
8+
@SpringMapperConfig(conversionServiceAdapterPackage = "org.mapstruct.extensions.spring.example.boot")
79
public interface MapperSpringConfig {
810
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.mapstruct.extensions.spring.example.boot;
2+
3+
import org.junit.jupiter.api.Test;
4+
import org.springframework.boot.autoconfigure.AutoConfigurations;
5+
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
6+
7+
import static org.assertj.core.api.Assertions.assertThat;
8+
9+
10+
public class ContextLoadsWithLazyTest {
11+
12+
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
13+
.withConfiguration(AutoConfigurations.of(Start.class));
14+
15+
@Test
16+
public void shouldLoadContext() {
17+
this.contextRunner.run(context -> {
18+
assertThat(context).hasBean("conversionServiceAdapter");
19+
});
20+
}
21+
}

extensions/src/main/java/org/mapstruct/extensions/spring/converter/ConversionServiceAdapterDescriptor.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public class ConversionServiceAdapterDescriptor {
1010
private ClassName adapterClassName;
1111
private String conversionServiceBeanName;
1212
private List<Pair<TypeName, TypeName>> fromToMappings;
13+
private boolean lazyAnnotatedConversionServiceBean;
1314

1415
public ClassName getAdapterClassName() {
1516
return adapterClassName;
@@ -34,4 +35,12 @@ public List<Pair<TypeName, TypeName>> getFromToMappings() {
3435
public void setFromToMappings(final List<Pair<TypeName, TypeName>> fromToMappings) {
3536
this.fromToMappings = fromToMappings;
3637
}
38+
39+
public boolean isLazyAnnotatedConversionServiceBean() {
40+
return lazyAnnotatedConversionServiceBean;
41+
}
42+
43+
public void setLazyAnnotatedConversionServiceBean(boolean lazyAnnotatedConversionServiceBean) {
44+
this.lazyAnnotatedConversionServiceBean = lazyAnnotatedConversionServiceBean;
45+
}
3746
}

extensions/src/main/java/org/mapstruct/extensions/spring/converter/ConversionServiceAdapterGenerator.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ private static ParameterSpec buildConstructorParameterSpec(final ConversionServi
5656
if (StringUtils.isNotEmpty(descriptor.getConversionServiceBeanName())) {
5757
parameterBuilder.addAnnotation(buildQualifierANnotation(descriptor));
5858
}
59-
parameterBuilder.addAnnotation(buildLazyAnnotation());
59+
if (Boolean.TRUE.equals(descriptor.isLazyAnnotatedConversionServiceBean())) {
60+
parameterBuilder.addAnnotation(buildLazyAnnotation());
61+
}
6062
return parameterBuilder.build();
6163
}
6264

extensions/src/main/java/org/mapstruct/extensions/spring/converter/ConverterMapperProcessor.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ public boolean process(
6464
descriptor.setAdapterClassName(
6565
ClassName.get(adapterPackageAndClass.getLeft(), adapterPackageAndClass.getRight()));
6666
descriptor.setConversionServiceBeanName(getConversionServiceName(annotations, roundEnv));
67+
descriptor.setLazyAnnotatedConversionServiceBean(getLazyAnnotatedConversionServiceBean(annotations, roundEnv));
6768
annotations.stream()
6869
.filter(this::isMapperAnnotation)
6970
.forEach(
@@ -198,6 +199,17 @@ private SpringMapperConfig toSpringMapperConfig(final Element element) {
198199
return element.getAnnotation(SpringMapperConfig.class);
199200
}
200201

202+
private boolean getLazyAnnotatedConversionServiceBean(
203+
final Set<? extends TypeElement> annotations, final RoundEnvironment roundEnv) {
204+
return annotations.stream()
205+
.filter(annotation -> SPRING_MAPPER_CONFIG.contentEquals(annotation.getQualifiedName()))
206+
.findFirst()
207+
.flatMap(annotation -> findFirstElementAnnotatedWith(roundEnv, annotation))
208+
.map(this::toSpringMapperConfig)
209+
.map(SpringMapperConfig::lazyAnnotatedConversionServiceBean)
210+
.orElse(Boolean.TRUE);
211+
}
212+
201213
private Optional<? extends TypeMirror> getConverterSupertype(final Element mapper) {
202214
final Types typeUtils = processingEnv.getTypeUtils();
203215
return typeUtils.directSupertypes(mapper.asType()).stream()

extensions/src/test/java/org/mapstruct/extensions/spring/converter/ConversionServiceAdapterGeneratorTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ void shouldGenerateMatchingOutput() throws IOException {
3333
"ConversionServiceAdapter"));
3434
descriptor.setFromToMappings(
3535
singletonList(Pair.of(ClassName.get("test", "Car"), ClassName.get("test", "CarDto"))));
36+
descriptor.setLazyAnnotatedConversionServiceBean(true);
3637
final StringWriter outputWriter = new StringWriter();
3738

3839
// When
@@ -54,6 +55,7 @@ void shouldGenerateMatchingOutputWhenUsingCustomConversionService() throws IOExc
5455
descriptor.setConversionServiceBeanName("myConversionService");
5556
descriptor.setFromToMappings(
5657
singletonList(Pair.of(ClassName.get("test", "Car"), ClassName.get("test", "CarDto"))));
58+
descriptor.setLazyAnnotatedConversionServiceBean(true);
5759
final StringWriter outputWriter = new StringWriter();
5860

5961
// When

0 commit comments

Comments
 (0)