He desarrollado un simple anotación de interfaz
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnnotation {
String foo() default "foo";
}
a continuación, lo prueba la anotación de una Clase
@CustomAnnotation
public class AnnotatedClass {
}
y lo llaman usando un método
public void foo() {
CustomAnnotation customAnnotation = AnnotatedClass.class.getAnnotation(CustomAnnotation.class);
logger.info(customAnnotation.foo());
}
y todo trabaja muy bien, ya que registra foo . Trato también cambiar la clase anotada a @CustomAnnotation(foo = "123")
y todo funciona bien también, becuase registra 123 .
Ahora quiero que el valor pasado a la anotación se recupera por el application.properties
, así que he cambiado mi clase anotada a
@CustomAnnotation(foo = "${my.value}")
public class AnnotatedClass {
}
pero ahora el registro devuelve la cadena ${my.vlaue}
y no el valor en application.properties
.
Sé que es posible el uso ${}
de instrucciones en la anotación porque siempre uso una @RestController
como esta @GetMapping(path = "${path.value:/}")
y todas las obras excelentes.
Mi solución de repositorio de Github: https://github.com/federicogatti/annotatedexample
No se puede hacer algo así directamente como annotation attribute's value must be a constant expression.
Lo que puede hacer es, puede pasar valor foo como cadena como @CustomAnnotation(foo = "my.value")
y crear consejos AOP para obtener el valor cadena de anotación y las operaciones de búsqueda de propiedades de la aplicación.
crear AOP con @Pointcut
, @AfterReturn
o proporcionada a otros para que coincida @annotation
, etc método y escribir la lógica de propiedad de consulta para la cadena correspondiente.
Configurar
@EnableAspectJAutoProxy
la aplicación principal o la creación de por clase de configuración.Añadir la dependencia AOP:
spring-boot-starter-aop
Crear
@Aspect
con punto de corte.@Aspect public class CustomAnnotationAOP { @Pointcut("@annotation(it.federicogatti.annotationexample.annotationexample.annotation.CustomAnnotation)") //define your method with logic to lookup application.properties
Ver más en Guía oficial: Programación Orientada a Aspectos con la primavera