Skip to content

Commit 43581b8

Browse files
stickfigureJeff Schnitzer
andauthored
Replace generated javax.annotation.PostConstruct with jakarta (#110)
* Replace generated javax.annotation.PostConstruct with jakarta.annotation.PostConstruct * Auto detect jakarta vs javax PostConstruct * Use annotation processing mechanism to discover PostConstruct package * Add a test for jakarta PostConstruct --------- Co-authored-by: Jeff Schnitzer <[email protected]>
1 parent da772e6 commit 43581b8

File tree

4 files changed

+62
-3
lines changed

4 files changed

+62
-3
lines changed

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,19 @@ protected TypeSpec createMainTypeSpec(final ConversionServiceAdapterDescriptor d
5555
.build();
5656
}
5757

58-
private static MethodSpec createRegistrationMethodSpec(
58+
private ClassName postConstructClassName() {
59+
if (isTypeAvailable("jakarta.annotation.PostConstruct")) {
60+
return ClassName.get("jakarta.annotation", "PostConstruct");
61+
} else {
62+
return ClassName.get("javax.annotation", "PostConstruct");
63+
}
64+
}
65+
66+
private MethodSpec createRegistrationMethodSpec(
5967
final FieldSpec convertersFieldSpec, final FieldSpec conversionServiceFieldSpec) {
68+
6069
return MethodSpec.methodBuilder("registerConverters")
61-
.addAnnotation(ClassName.get("javax.annotation", "PostConstruct"))
70+
.addAnnotation(postConstructClassName())
6271
.addStatement(
6372
"$N.forEach($N::addConverter)", convertersFieldSpec, conversionServiceFieldSpec)
6473
.build();

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ private boolean isSourceVersionAtLeast9() {
8080
return getProcessingEnvironment().getSourceVersion().compareTo(RELEASE_8) > 0;
8181
}
8282

83-
private boolean isTypeAvailable(final String name) {
83+
protected boolean isTypeAvailable(final String name) {
8484
return getProcessingEnvironment().getElementUtils().getTypeElement(name) != null;
8585
}
8686

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,26 @@
33
import static java.lang.Boolean.TRUE;
44
import static javax.lang.model.SourceVersion.RELEASE_8;
55
import static javax.lang.model.SourceVersion.RELEASE_9;
6+
import static org.mockito.ArgumentMatchers.anyString;
67
import static org.mockito.BDDMockito.given;
78
import static org.mockito.Mockito.mock;
9+
import static org.mockito.Mockito.when;
810

911
import java.io.IOException;
1012
import java.util.Map;
1113
import javax.annotation.processing.ProcessingEnvironment;
1214
import javax.lang.model.SourceVersion;
1315
import javax.lang.model.element.TypeElement;
1416
import javax.lang.model.util.Elements;
17+
18+
import org.junit.Rule;
1519
import org.junit.jupiter.api.BeforeEach;
1620
import org.junit.jupiter.api.Nested;
1721
import org.junit.jupiter.api.Test;
1822
import org.junit.jupiter.api.extension.ExtendWith;
1923
import org.mockito.Mock;
24+
import org.mockito.junit.MockitoJUnit;
25+
import org.mockito.junit.MockitoRule;
2026
import org.mockito.junit.jupiter.MockitoExtension;
2127
import org.mockito.stubbing.Answer;
2228

@@ -122,6 +128,24 @@ void shouldGenerateMatchingOutput() throws IOException {
122128
underTest::writeGeneratedCodeToOutput);
123129
}
124130
}
131+
132+
@Nested
133+
class NoGeneratedJakartaAnnotation {
134+
@BeforeEach
135+
void initElements() {
136+
isAtLeastJava9 = false;
137+
when(elements.getTypeElement(anyString()))
138+
.thenReturn(null, mock(TypeElement.class)); // first for Generated, second for PostConstruct
139+
}
140+
141+
@Test
142+
void shouldGenerateMatchingOutput() throws IOException {
143+
ConverterRegistrationConfigurationGeneratorTest.this
144+
.shouldGenerateMatchingOutputWhenUsingCustomConversionService(
145+
"ConverterRegistrationConfigurationNoGeneratedJakartaAnnotation.java",
146+
underTest::writeGeneratedCodeToOutput);
147+
}
148+
}
125149
}
126150

127151
@Nested
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.mapstruct.extensions.spring.converter;
2+
3+
import jakarta.annotation.PostConstruct;
4+
import java.util.List;
5+
import org.springframework.beans.factory.annotation.Qualifier;
6+
import org.springframework.context.annotation.Configuration;
7+
import org.springframework.core.convert.converter.Converter;
8+
import org.springframework.core.convert.support.ConfigurableConversionService;
9+
10+
@Configuration
11+
class ConverterRegistrationConfiguration {
12+
private final ConfigurableConversionService myConversionService;
13+
private final List<Converter<?, ?>> converters;
14+
15+
ConverterRegistrationConfiguration(
16+
@Qualifier("myConversionService") final ConfigurableConversionService myConversionService,
17+
final List<Converter<?, ?>> converters) {
18+
this.myConversionService = myConversionService;
19+
this.converters = converters;
20+
}
21+
22+
@PostConstruct
23+
void registerConverters() {
24+
converters.forEach(myConversionService::addConverter);
25+
}
26+
}

0 commit comments

Comments
 (0)