Interfaz de anotación no acepta application.properties valor

Federico Gatti:

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 @RestControllercomo esta @GetMapping(path = "${path.value:/}")y todas las obras excelentes.


Mi solución de repositorio de Github: https://github.com/federicogatti/annotatedexample

kj007:

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, @AfterReturno proporcionada a otros para que coincida @annotation, etc método y escribir la lógica de propiedad de consulta para la cadena correspondiente.

  1. Configurar @EnableAspectJAutoProxyla aplicación principal o la creación de por clase de configuración.

  2. Añadir la dependencia AOP: spring-boot-starter-aop

  3. Crear @Aspectcon 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

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=176551&siteId=1
Recomendado
Clasificación