当前位置: 首页 > 知识库问答 >
问题:

为什么我不能用Spring的@Value注释注入我的PoJo之一?

都沈浪
2023-03-14

在Spring中,我可以使用@值注入配置各种对象,如int、boolean、String等。我甚至可以用一个@值注入配置整个映射结构。

假设我们有以下TCP服务器规范类:

public class TcpServerSpec {

    private boolean enabled;
    private String host;
    private int port;

    /* getters & setters */
}

我可以按名称插入多个服务器规范的映射,执行。。。

@Value("${com.harry.potter.sockets}")
private HashMap<String, TcpServerSpec> sockets;

。。。使用以下YAML配置(application-test1.yml):

com:
  harry:
    potter:
      sockets:
        server1:
          enabled: true
          host: host1
          port: 1111
        server2:
          enabled: true
          host: host2
          port: 2222

但通常需要介于两者之间:只注入一个TcpServerSpec:

@Value("${com.harry.potter.sockets.server1}")
private TcpServerSpec server1;

然后我可以成功通过以下测试:

@RunWith(SpringRunner.class)
@SpringBootTest
@ConfigurationProperties("com.harry.potter.sockets")
@TestPropertySource(locations = "classpath:application-test1.yml")
public class MyServerConfiguration1Test {

    @Value("${com.harry.potter.sockets.server1}")
    private TcpServerSpec server1;

    @Value("${com.harry.potter.sockets.server2}")
    private TcpServerSpec server2;

    @Test
    public void testServer1Spec() {
        Assert.assertTrue(server1.isEnabled());
        Assert.assertThat(server1.getHost(), is("host1"));
        Assert.assertThat(server1.getPort(), is(1111));
    }

    @Test
    public void testServer2Spec() {
        Assert.assertTrue(server2.isEnabled());
        Assert.assertThat(server2.getHost(), is("host2"));
        Assert.assertThat(server2.getPort(), is(2222));
    }
}

为什么这不可能?还是这样?

共有1个答案

彭令秋
2023-03-14

你想要的不是@Value,而是@ConfigurationProperties。

您可以像这样手动声明bean:

@Configuration
class BeanConfig {
  
  @Bean
  @ConfigurationProperties(prefix = "com.harry.potter.sockets.server1")
  public TcpServerSpec server1() {
    return new TcpServerSpec();
  }

  @Bean
  @ConfigurationProperties(prefix = "com.harry.potter.sockets.server2")
  public TcpServerSpec server2() {
    return new TcpServerSpec();
  }
}

然后将这些bean注入@Qualifier(“server1”)和@Qualifier(“server2”)。

 类似资料:
  • 我在这个论坛上读到了很多关于尝试Autowire pojo时发生的类似问题的文章,通常修复的答案与或/有关。但是,在我的例子中,我设法autowire我的pojo(Mas60010),但我不能autowire或以及可能来自我没有编写代码的包的任何其他对象。 为了简单起见,我只提到。我做错了什么?我想问题要么出在库上,要么出在配置上。注意:请不要仅仅通过显示一个与他自己的POJO相关的问题来指出这个

  • 我们一直在使用Spring@Value注释来注入属性值。我们有一个约定来命名属性名称,以匹配它们注入的java字段。这带来了不必要的工作,即每个ConfigBean的java字段都需要用@Value注释。 我正在寻找一种方法,用新的注释注释java类(比如说ConfigBean),让一些后处理器读取这些bean的属性名称,并自动注入属性值。 我正在寻找一些关于如何在没有@Value注释的情况下实现

  • 问题内容: 我有 一切都正确加载。 然后在我的JavaScript中,我尝试注入ngCookies: 但是它似乎找不到$ cookies: 问题答案: 我不确定您的功能用例是什么,但是您不能在配置块中注入服务(即服务)。仅常量和提供程序可以注入配置块内。 您可以将服务注入运行块,但我不知道这是否对您有帮助,因为我不确定您打算如何处理这些cookie。 顺便说一句:您似乎在混合主角度文件和模块的版本

  • 问题内容: 我将Spring 3.1.3用于Web应用程序,将XML配置与组件扫描结合使用。 我意识到,其中一个扫描组件必须在其他几个组件之前进行初始化。在所有需要构造后初始化的类上,我在方法上具有@PostConstruct批注。 为了设置依赖关系顺序,我在需要先后构造的类上将“ @Component”更改为“ @Component(“ configData”)”。然后,在每个需要在“ conf

  • 根据我所读到的内容,这是我执行依赖顺序所需要的全部内容。 然后我构建了所有的东西,设置了我的断点,并启动了应用程序。我希望在任何依赖bean之前到达“configData”bean中的断点。事情不是这样的。第一个断点在一个依赖bean的“init”方法中。 然后我更改了“log4j.xml”,将“debug”设置为“org.springframework”的日志级别,并重新运行测试。断点行为是相同

  • 这是我的束缚 错误在于 /Users/X/AndroidStudioProjects/Corotuines/app/build/generated/source/kapt/debug/com/example/corotuines/application/ApplicationMain_HiltComponents.java:126:错误:[Dagger/Mis的绑定]com.example.cor