在接口注释中使用application.properties值

时间:2018-09-24 13:45:40

标签: java spring spring-boot

application.properties值是否可以在注释声明中使用,或更普遍地在 Interfance 中使用? 例如,我有:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EndLogging {
    String BusinessOperationName() default  "NOME_BUSINESSOPERATIONNAME_UNDEFINED";
    String ProcessName() default "NOME_MICROSERVZIO_UNDEFINED";
}

但是我希望该方法返回的默认值为application.properties值,例如:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EndLogging {
    String BusinessOperationName() default  @Value("${business.value}");
    String ProcessName() default @Value("${process.value}");
}

1 个答案:

答案 0 :(得分:5)

否,这不可能(直接)。

注释属性的默认值必须是编译时常量。您尝试从application.properties注入的值不是编译时常量。

您可以做的是使用特殊标记值作为默认值,然后在处理注释的逻辑中识别该特殊标记值,然后使用例如从属性文件中获取的值。

例如,如果您将使用@EndLogging注释的第一个版本,并且有一个处理该注释的Spring bean,它将看起来像这样:

// Class that processes the @EndLogging annotation
@Component
public class SomeClass {

    @Value("${business.value}")
    private String defaultBusinessOperationName;

    @Value("${process.value}")
    private String defaultProcessName;

    public void processAnnotation(EndLogging annotation) {
        // ...

        String businessOperationName = annotation.BusinessOperationName();
        if (businessOperationName.equals("NOME_BUSINESSOPERATIONNAME_UNDEFINED")) {
            businessOperationName = defaultBusinessOperationName;
        }

        String processName = annotation.ProcessName();
        if (processName.equals("NOME_MICROSERVZIO_UNDEFINED")) {
            processName = defaultProcessName;
        }

        // ...
    }
}