如何在实现 Condition/ConfigurationCondition 接口的类中使用 @Value 或 Environment

2023-12-08

我只使用 JavaConfig。

我有以下声明:

@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
}

根据以下帖子,JavaConfig 是强制性的:Spring 3.2 @value注释与纯java配置不起作用,但Environment.getProperty起作用

以下代码工作完美(通过测试目的有许多@Values):

@Configuration
public class ActiveMQServerConfiguration {

    @Value("${localhost.address}")
    private String localHost;

    @Value("${remotehost.address}")
    private String remoteHost;

    @Value("${localhost.port}")
    private Integer localPort;

    @Value("${remotehost.port}")
    private Integer remotePort;

    @Bean(name="connectionFactory")
    @Conditional(LocalHostStatusCondition.class)
    public ActiveMQConnectionFactory localConnectionFactory(
            @Value("${localhost.protocol}") String protocol,
            @Value("${localhost.address}") String host,
            @Value("${localhost.port}") String port ){

        System.out.println("protocol: "+protocol);
        System.out.println("host: "+host);
        System.out.println("port: "+port);

        System.out.println("localHost: "+localHost);
        System.out.println("localPort: "+localPort);
        System.out.println("remoteHost: "+remoteHost);
        System.out.println("remotePort: "+remotePort);

我可以在控制台/终端中看到

Alpha

protocol: tcp
host: 127.0.0.1
port: 61616
localHost: 127.0.0.1
localPort: 61616
remoteHost: 192.168.1.34
remotePort: 61616

但以下内容并不按预期工作:

public class LocalHostStatusCondition implements Condition {

    private static final Logger logger = LoggerFactory.getLogger(LocalHostStatusCondition.class);

    @Value("${localhost.address}")
    private String localHost;

    @Value("${remotehost.address}")
    private String remoteHost;

    @Value("${localhost.port}")
    private Integer localPort;

    @Value("${remotehost.port}")
    private Integer remotePort;

    @Autowired
    private Environment environment;

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        logger.info("LocalHostStatusCondition...");

        System.out.println("localHost: "+localHost);
        System.out.println("localPort: "+localPort);
        System.out.println("remoteHost: "+remoteHost);
        System.out.println("remotePort: "+remotePort);
        System.out.println("Env..." + environment.getProperty("localhost.address", String.class) );

几乎相同,甚至与环境

输出是:

Beta

localHost: null
localPort: null
remoteHost: null
remotePort: null
[WARNING] 
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:293)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
    at com.manuel.jordan.infrastructure.support.LocalHostStatusCondition.matches(LocalHostStatusCondition.java:42)

根据条件API:

条件必须遵循与 BeanFactoryPostProcessor 相同的限制,并且注意不要与 bean 实例交互。为了更细粒度地控制与 @Configuration beans 交互的条件,请考虑配置条件界面。

About 配置条件我读过这个何时使用 Spring @ConfigurationCondition 与 @Condition? too

我已编辑如下:

public class LocalHostStatusCondition implements ConfigurationCondition {

…

    @Override
    public ConfigurationPhase getConfigurationPhase() {
        return ConfigurationPhase.PARSE_CONFIGURATION;
    }

如果我使用:

  • 配置阶段.REGISTER_BEAN我如何得到相同的输出Beta
  • ConfigurationPhase.PARSE_CONFIGURATION;我没有收到任何错误,但是...

但控制台/终端没有显示任何有关句子的信息,我的意思是,System.out 没有打印(我不明白这种奇怪的行为)。

我该如何解决这个问题?

我需要有工作@Value或环境,它的目的是让应用程序知道是否应该连接到本地或远程ActiveMQ服务器。

是的,我已阅读以下内容:如何延迟 Spring @Conditional 配置注释的评估?好像没有解决办法……

谢谢


你有

@Conditional(LocalHostStatusCondition.class)

春天带走了Class您指定的类型并实例化它以使用它的matches方法。它不会将实例视为 bean,不会对其执行自动装配,也不会执行任何操作@Value加工。后者适用于BeanFactoryPostProcessor以及。

您可以检索Environment来自ConditionContext如果你想。另一种方法是自己加载属性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在实现 Condition/ConfigurationCondition 接口的类中使用 @Value 或 Environment 的相关文章

随机推荐

  • 就地生成 2 个向量的笛卡尔积?

    如果我想得到这两个的笛卡尔积vector
  • 如何在曲面图上投影一条线?

    我有一个根据 CSV 文件中存储的点数据创建的曲面图 如果我想在 3D 创建的表面上投影一条线 漂浮在表面上方 方法是什么 我尝试过来自的代码以下帖子用于在 xy xz yz 平面上投影一条线 我可以看到它正在将线的端点投影到 xy xz
  • Bash-if 子句无法正常工作[重复]

    这个问题在这里已经有答案了 我想制作一个关闭脚本 但它没有按预期工作 这是我写的 echo Wanna shutdown y n read ANSWER if ANSWER y then sudo shutdown P now else p
  • CSS:“正确”属性拒​​绝申请?

    这真让我抓狂 我有两个 div 就在 body 标签之后 它们的位置和大小都是绝对的 它们都具有相同的 左 属性 但我后来声明了第二个 div 的 右 属性 因此 左 应该被忽略 这是 HTML div class previousPage
  • iOS Objective C - UIWebView 自动填充和执行

    我想知道是否有任何可能的方法可以让 webview 自动输入网站上文本框的值并提交 以便用户可以完全绕过搜索 特别是搜索表单 那么用户只能看到结果 一个例子是 http www eatwellguide org mobile 我注意到查看它
  • 泛型 > 在 collection.sort/ 类似的代码?

    我一直使用类似的接口通过 collection sort 为我的类提供自然排序 基本上 如果我有一个 person 类 我将让它实现 Comparable 接口并提供compareTo 的实现 但是在 javadocs 中 Collecti
  • 在hibernate中如何使用not in子句

    我有两张桌子 就业和生产 生产表有 jobid 字段 该字段引用作业表的 jobid 在hibernate中如何使用not in子句 实现如下sql查询 SELECT FROM jobs where job id not in 从生产中选择
  • 在Python中返回一个角色中的对象并在QML中获取另一个对象的引用

    我正在写一个 Twitter 客户端 我实施了TweetItem and TweetModel 问题是有一个角色TweetItem called original 我希望它指向原始推文 更新 我的代码中有一些拼写错误 现在我修复了它们 im
  • 如何定义静态运算符<<?

    是否可以定义一个仅对类的静态成员进行操作的静态插入运算符 就像是 class MyClass public static std string msg static MyClass operator lt lt const std stri
  • 在 OpenGL 中绑定零纹理

    在我的程序中 我使用 2 个纹理 t0 和 t1 t1 是附加的 仅在某些情况下需要 glActiveTexture GL TEXTURE1 if mDisplayMode EDM DEFAULT glBindTexture GL TEXT
  • 如何获取特定月份和年份的天数

    我有一个传递两个参数 Month 和 Year 的方法 我会这样调用这个方法 MonthDates January 2010 public static string MonthDates string MonthName string Y
  • iPhone——以编程方式创建UITabBar?

    如何做到这一点 请注意 我不想要控制器 只是一个标签栏 UITabBar aTabBar UITabBar alloc initWithFrame aFrame 您可能需要参考类文档例如像这样的方法 setItems animated 另外
  • 如何在 CSS 和 HTML 中创建价格标签形状

    所以我找到了这个答案 CSS3菜单形状 样式但不知道如何将其放在左侧 我已经搜索过了 但没有运气 这就是我想要实现的目标 我也发现了这个 改变三角形的形状 我怎样才能让它在另一侧工作 我的意思是箭头需要位于左侧 是否可以用一个来做到这一点d
  • 在matlab中用渐变灰度颜色绘制圆

    我想在matlab中画一个带有渐变颜色的圆 但我不能 有谁可以帮助我吗 示例图片可以在这里找到 这是一种方法 N 200 this decides the size of image X Y meshgrid 1 1 N 1 1 1 N 1
  • r 过滤具有唯一字段的数据框[重复]

    这个问题在这里已经有答案了 我给出了编码和 R 的第一步 但我遇到了一个问题 我有一个具有以下格式的数据框 Months Person April Person1 May Person2 April Person1 June Person
  • 自定义属性编辑器不适用于 Spring MVC 中的请求参数?

    我正在尝试使用 Spring 注释创建一个多操作 Web 控制器 该控制器将负责添加和删除用户配置文件并为 jsp 页面准备参考数据 Controller public class ManageProfilesController Init
  • app-inventor:将应用程序安装到 SD 卡上

    编辑以显示提问后一周的当前状态 我深入研究了应用程序发明家 因为我的孩子 10 岁和 12 岁 即将获得他们的第一部 Android 手机 并且已经完成了一些拖放编程 游戏制作者 所以我认为这对他们来说可能是一个很好的切入点 我现在已经用应
  • Swift 中的可变参数

    我有一段非常简单的代码 它在 Swift 语言中使用可变参数 我不明白它为什么抱怨 Double 不是相当于 Double 吗 我知道我可以这样传递 printList 2 3 4 5 我猜 Variadic 和我想象的不一样 您可以传递多
  • Laravel 多重联合

    我在以 laravel 方式 添加具有多个联合的查询时遇到问题 我正在尝试完成一个与以下生成的查询等效的查询 ipsql for n 1 n lt total networks n ipsql SELECT FROM ip WHERE ne
  • 如何在实现 Condition/ConfigurationCondition 接口的类中使用 @Value 或 Environment

    我只使用 JavaConfig 我有以下声明 Bean public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer return new