Skip to content

Commit f5bffde

Browse files
committed
Merge branch '4.7.x' into 4.8.x
2 parents 15b586d + b7f518e commit f5bffde

File tree

7 files changed

+92
-8
lines changed

7 files changed

+92
-8
lines changed

Diff for: aop/src/main/java/io/micronaut/aop/chain/AdapterIntroduction.java

+9-5
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import io.micronaut.aop.MethodInterceptor;
2020
import io.micronaut.aop.MethodInvocationContext;
2121
import io.micronaut.context.BeanContext;
22+
import io.micronaut.core.annotation.AnnotationValue;
2223
import io.micronaut.core.annotation.Internal;
2324
import io.micronaut.core.annotation.Nullable;
2425
import io.micronaut.core.util.StringUtils;
@@ -49,19 +50,22 @@ final class AdapterIntroduction implements MethodInterceptor<Object, Object> {
4950
* @param method The target method
5051
*/
5152
AdapterIntroduction(BeanContext beanContext, ExecutableMethod<?, ?> method) {
52-
Class<?> beanType = method.classValue(Adapter.class, ADAPTED_BEAN).orElse(null);
53-
53+
AnnotationValue<Adapter> adapterAnnotationValue = method.getAnnotation(Adapter.class);
54+
if (adapterAnnotationValue == null) {
55+
throw new IllegalStateException("Adapter method must have @Adapter annotation");
56+
}
57+
Class<?> beanType = adapterAnnotationValue.classValue(ADAPTED_BEAN).orElse(null);
5458
if (beanType == null) {
5559
throw new IllegalStateException("No bean type to adapt found in Adapter configuration for method: " + method);
5660
}
5761

58-
String beanMethod = method.stringValue(Adapter.class, ADAPTED_METHOD).orElse(null);
62+
String beanMethod = adapterAnnotationValue.stringValue(ADAPTED_METHOD).orElse(null);
5963
if (StringUtils.isEmpty(beanMethod)) {
6064
throw new IllegalStateException("No bean method to adapt found in Adapter configuration for method: " + method);
6165
}
6266

63-
String beanQualifier = method.stringValue(Adapter.class, ADAPTED_QUALIFIER).orElse(null);
64-
Class<?>[] argumentTypes = method.classValues(Adapter.class, ADAPTED_ARGUMENT_TYPES);
67+
String beanQualifier = adapterAnnotationValue.stringValue(ADAPTED_QUALIFIER).orElse(null);
68+
Class<?>[] argumentTypes = adapterAnnotationValue.classValues(ADAPTED_ARGUMENT_TYPES);
6569
Class<?>[] methodArgumentTypes = method.getArgumentTypes();
6670
Class<?>[] arguments = argumentTypes.length == methodArgumentTypes.length ? argumentTypes : methodArgumentTypes;
6771
if (StringUtils.isNotEmpty(beanQualifier)) {

Diff for: core/src/main/java/io/micronaut/core/annotation/AnnotationClassValue.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ public AnnotationClassValue(@NonNull T instance) {
9595
this.theClass = (Class<T>) instance.getClass();
9696
this.name = theClass.getName();
9797
this.instance = instance;
98-
this.instantiated = true;
98+
this.instantiated = !(instance instanceof AnnotationClassValue.UnresolvedClass);
9999
}
100100

101101
/**
@@ -120,8 +120,7 @@ public AnnotationClassValue(@NonNull T instance) {
120120
* @since 1.1
121121
*/
122122
public boolean isInstantiated() {
123-
return instantiated ||
124-
(getInstance().isPresent() && !(getInstance().get() instanceof AnnotationClassValue.UnresolvedClass));
123+
return instantiated;
125124
}
126125

127126
/**

Diff for: inject-kotlin/src/main/kotlin/io/micronaut/kotlin/processing/visitor/KotlinClassElement.kt

+6
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,12 @@ internal open class KotlinClassElement(
151151
// We need to aggregate all the hierarchy properties because
152152
// getAllProperties doesn't return correct parent of the property
153153
properties.addAll(clazz.getDeclaredSyntheticBeanProperties())
154+
clazz.interfaces.forEach {
155+
if (it is KotlinClassElement) {
156+
properties.addAll(it.getDeclaredSyntheticBeanProperties())
157+
}
158+
}
159+
154160
clazz = clazz.superType.orElse(null) as KotlinClassElement?
155161
}
156162
properties

Diff for: inject-kotlin/src/test/groovy/io/micronaut/kotlin/processing/inject/ast/ClassElementSpec.groovy

+25
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import io.micronaut.runtime.context.env.ConfigurationAdvice
2626
import jakarta.validation.Valid
2727
import spock.lang.PendingFeature
2828

29+
import static io.micronaut.annotation.processing.test.KotlinCompiler.buildContext
30+
2931
class ClassElementSpec extends AbstractKotlinCompilerSpec {
3032

3133
void "test Java Record compile"() {
@@ -171,6 +173,29 @@ class MyBean {}
171173
} != null
172174
}
173175

176+
void "test interface native properties"() {
177+
178+
when:
179+
def nativeProps = buildClassElementMapped('test.BaseConfiguration', '''
180+
package test
181+
182+
import io.micronaut.context.annotation.ConfigurationProperties
183+
184+
@ConfigurationProperties("base")
185+
interface BaseConfiguration : Other {
186+
val port: Int
187+
}
188+
189+
interface Other {
190+
val host: String
191+
}
192+
''', ce -> ce.syntheticBeanProperties)
193+
194+
then:
195+
nativeProps.size() == 2
196+
nativeProps.collect { it.name } == ["port", "host"]
197+
}
198+
174199
void "test visitGeneratedFile"() {
175200
given:
176201
AllElementsVisitor.VISITED_CLASS_ELEMENTS.clear()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package io.micronaut.test.lombok;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
5+
import io.micronaut.core.annotation.Introspected;
6+
7+
@Introspected
8+
@JsonIgnoreProperties(ignoreUnknown = true)
9+
@JsonDeserialize(builder = Foo.FooBuilder.class)
10+
public interface Bar {
11+
12+
String getName();
13+
14+
}
15+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package io.micronaut.test.lombok;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import com.fasterxml.jackson.annotation.JsonInclude;
5+
import io.micronaut.core.annotation.Introspected;
6+
import lombok.Builder;
7+
import lombok.EqualsAndHashCode;
8+
import lombok.Getter;
9+
import lombok.ToString;
10+
import lombok.experimental.FieldNameConstants;
11+
import lombok.extern.jackson.Jacksonized;
12+
13+
@Getter
14+
@Builder(toBuilder = true)
15+
@ToString
16+
@Jacksonized
17+
@JsonIgnoreProperties(ignoreUnknown = true)
18+
@JsonInclude(JsonInclude.Include.NON_EMPTY)
19+
@EqualsAndHashCode
20+
@FieldNameConstants(innerTypeName = "UserField", asEnum = true)
21+
@Introspected
22+
public class Foo implements Bar {
23+
24+
private String name;
25+
26+
}

Diff for: test-suite/src/test/java/io/micronaut/test/lombok/LombokIntrospectedBuilderTest.java

+9
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,15 @@
1515

1616
public class LombokIntrospectedBuilderTest {
1717

18+
@Test
19+
void testLombokInheritance() {
20+
Foo foo = Foo.builder().name("Name").build();
21+
final BeanIntrospection<Foo> introspection = BeanIntrospection.getIntrospection(Foo.class);
22+
23+
Assertions.assertEquals("Name", foo.getName());
24+
Assertions.assertNotNull(introspection);
25+
}
26+
1827
@Test
1928
void testNoArgsAndAllArgsConstructor() {
2029
BeanIntrospection<BarCommand> introspection = BeanIntrospection.getIntrospection(BarCommand.class);

0 commit comments

Comments
 (0)