我使用的是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
将通过,因为它使用了适当的机制。