【问题标题】:@Conditionalonexpression on a class object getter类对象 getter 上的 @Conditionalonexpression
【发布时间】:2017-11-11 09:19:47
【问题描述】:

我想知道是否有一种方法可以通过评估在运行时获取其值的类的对象来在运行时使用@conditionalonexpression 启用类。

例如:

@ConditionalOnExpression(#{propertyobject.getexenabled()})
class ex1{

}

propertyobject 实例在运行时填充值(在程序开始时说) 这有可能实现吗?

【问题讨论】:

    标签: java spring spring-annotations


    【解决方案1】:

    是的,这是可能的,但getexenabled() 方法应该是静态的。

    喜欢:

    @SpringBootApplication
    public class So44456388Application {
    
        public static void main(String[] args) {
            SpringApplication.run(So44456388Application.class, args);
        }
    
        public static class Evaluator {
            public static boolean getexenabled() {
                //your logic here
                return true /*false*/;
            }
        }
    
        @Component
        @ConditionalOnExpression("#{T(com.stackoverflow.so44456388.So44456388Application$Evaluator).getexenabled()}")
        public static class RichBean {
            @PostConstruct
            private void init() {
                System.out.println("RichBean");
            }
        }
    }
    

    【讨论】:

    • 感谢@bohdan 的回复。我试过了,但得到了一个异常:嵌套异常是 java.lang.IllegalStateException:So44456388Application 上的错误处理条件。在我的项目中,Evaluator 类(从中读取值的类)位于单独的文件中。不像嵌套类。那会是个问题吗?或者基本上这个例外在这里意味着什么?
    • 是的,不幸的是,您必须为T() 指定完整的类名才能工作。喜欢#{T(com.mypackage.MyEvaluator).getexenabled()} 而不仅仅是#{T(MyEvaluator).getexenabled()}
    • 感谢博阿丹。我删除了类名之前的 $ 并且它起作用了。
    • @DeepakSelvakumar 没问题 :)
    • 从你的答案中去掉$,这样它对每个有这个问题的人来说都是完美的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多