【问题标题】:Can I use @ConditionalOnExpression to check for an annotation's property value?我可以使用@ConditionalOnExpression 检查注释的属性值吗?
【发布时间】:2018-05-11 01:48:57
【问题描述】:

我想要一个注释,它将根据属性的值引入不同的配置类。它可能会像这样工作:

(以上都是伪代码)

注释:

import org.springframework.context.annotation.Import;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(RedisConfig.class)
@Import(HazelCastConfig.class)
public @interface EnableCaching
{
    Class cacheType() default Redis.class;
}

其中一个配置的示例:

import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.cache.annotation.EnableCaching;

import java.util.List;

@EnableCaching
@ConditionalOnExpression("#{T(com.mypackage.CacheAnnotationMatcher).checkCacheType(com.mypackage.Redis.class)}")
public class RedisConfig
{
    //...elided...
}

其中CacheAnnotationMatcher.checkProperty 是我创建的一个类和方法,它找到@EnableCaching 注释并检查cacheType 属性并返回真/假。

【问题讨论】:

    标签: java spring spring-boot spring-config spring-boot-configuration


    【解决方案1】:

    我认为你可以在这里使用@ConditionalOnExpression,我完全看不出你的代码不能工作的原因,你试过了吗?

    【讨论】:

    • 不允许通过类。它抛出一个错误。并且“*”不适用于允许所有包。有没有办法传递 yaml 属性?
    • 你可以传递一个类,如:...checkCacheType(Class.forName('com.something.Clazz'))。或者将其作为字符串传递,并比较类的字符串表示。我不完全确定,传递 yaml 属性是什么意思。
    • 是的,如果必须,我会将其作为字符串传递,但我更愿意将其作为类传递。
    猜你喜欢
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    相关资源
    最近更新 更多