@AliasFor不适用于自定义批注中的属性



我使用的是SpringBoot 2.4.2。我正在努力与@AliasFor自定义注释。

我实现了下面的自定义注释。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CustomAnnotation {
@AliasFor("aliasAttribute")
String value() default "";
@AliasFor("value")
String aliasAttribute() "";
}

像这样使用

@CustomAnnoatation("test")
@Component
public class TestClass() {
// codes here
}

这个测试代码失败。

@SpringBootTest(classes = TestClass.class)
public class CustomAnnotationTest {
@Autowired
TestClass testClass;
@Test
public void valueTest1() {
Annotation annotation = testClass.getClass().getAnnotation(CustomAnnotation.class);
assertThat(((CustomAnnotation) annotation).value()).isEqualTo(((CustomAnnotation) annotation).aliasAttribute());
}
}

与消息

org.opentest4j.AssertionFailedError: 
Expecting:
<"">
to be equal to:
<"test">
我不知道为什么,有人知道吗?

注释是类、字段等的静态元数据,因此Spring无法对其进行任何更改。为了使@AliasFor的特性成为可能,Spring使用了他们所谓的合成注释。对于那些要使用/检测到的,您需要利用Spring内部来获得合成注释并使@AliasFor工作。为此使用AnnotationUtils.findAnnotation(Spring内部也使用)。

@AliasFor是一个Spring特性,所以如果不使用Spring组件,这将无法工作。

你的测试方法与

基本相同
@Test
public void valueTest1() {
Annotation annotation = TestClass.class.getAnnotation(CustomAnnotation.class);
assertThat(((CustomAnnotation) annotation).value()).isEqualTo(((CustomAnnotation) annotation).aliasAttribute());
}

这个测试和你的测试都将失败,因为它们根本没有使用Spring的基础设施来检测注释和应用Spring的特性。

当使用AnnotationUtils.findAnnotation时,测试将通过。

class CustomAnnotationTest {
@Test
void testStandardJava() {
CustomAnnotation annotation = TestClass.class.getAnnotation(CustomAnnotation.class);
assertThat(annotation.value()).isEqualTo(annotation.aliasAttribute());
}
@Test
void testWithSpring() {
CustomAnnotation annotation = AnnotationUtils.findAnnotation(TestClass.class, CustomAnnotation.class);
assertThat(annotation.value()).isEqualTo(annotation.aliasAttribute());
}
}

testStandardJava将失败,testWithSpring将通过,因为它使用了适当的机制。

最新更新