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

Spring boot自动连接:填充属性值的奇怪情况

赵景曜
2023-03-14

我被一些事情弄得晕头转向,在发现我的代码在过去两年中正常工作后,我什么也睡不着,而这显然是不应该的!所以这是一个Spring boot应用程序。应用程序有一些控制器。我正在使用的一个类扩展了WebServiceGatewaySupport,因此需要我@Autowire这个。类名为AClient。现在,这个类需要4个属性才能工作。其中三个来自属性文件,例如。

@Value("${a.userName}")String userName; 

所以有三个属性显然是从应用程序中挑选出来的。属性文件。现在第四处房产把我吹走了。它不是作为rest 3获取的,而是从构造函数参数复制的。因此,类中只有一个构造函数:

public AClient(String d){
    this.d=d;
}

现在这个属性正在这个类的方法之一中使用

public String getSomeData(){
// This method gets Data based on property d
}

有趣和令人惊讶的是,每次访问这个bean时,这个属性的值都会出现!bean只在一个地方,在Controller类中的一个地方是“自动加载”。我没有标记要从application.properties文件中获取的属性值。我没有为这个类提供任何从哪里获取d值的线索。我没有为其他类提供任何公共方法来设置这个值。然而代码是有效的,我甚至可以在方法get某某数据()中放置一个调试指针,并看到d的值存在!

现在我明白我可能错过了一些明显的东西,但是什么?有没有一种方法可以在@Autow的对象被实例化时进入Spring容器并从那一点进行调试以查看这个值的来源?我已经多次检查了代码。在Google上运行数百个查询,以找到类似Spring boot的东西,它会做一些神奇的事情来映射丢失的String属性。但是属性文件中的变量名与AClient类中的变量名不同。那么它怎么能映射呢?这现在真的要杀了我!

补充:不太相关,但代码正在以标准方式访问:

@Autowired
AClient aClient;

public someOtherMethod(){
    aClient.getSomeData();
}

所以,当我将调试器放置在someOtherMethod()的第一行并将鼠标悬停在aClient上时,它会显示填充的变量d值,与应用程序中的值相同。属性文件!

编辑:以下是我错过的内容:

@Configuration
public class someConfig{
@Bean
   public AClient aClient(){
    // Someone else fetched property from application.properties file, created an object of AClient class using argument constructor and returned that object here. So now Spring is using @Autowire reference for this object I guess
 }
}

共有1个答案

谷玉韵
2023-03-14

那么基本上,您的配置类与此类似?

@Configuration
public class SomeConfig {

    @Value("${a-client.important-value-d}")
    private String importantValueDFromApplicationProperties;

    @Bean
    public AClient aClient() {
        return new AClient(importantValueDFromApplicationProperties);
    }

}

如果是,则Spring将为每个请求它的自动连线客户端创建一个客户端。因此,在这个特定的实例中会出现importantValueDFromApplicationProperties的值。

另一个注意事项:我建议使用Spring Boot的配置属性,而不是值。看一看。

 类似资料:
  • 我是Spring的新手。我正面临Spring-Boot的问题。我正在尝试将外部配置文件中的字段自动装配到自动装配的bean中。我有以下类 应用程序。Java语言 AppConfig。Java语言 服务接口 服务1 我无法在App类的postconstruct方法中显示服务名称变量。我这样做对吗?

  • 出于某种原因,我使用外部属性源,其中一个外部属性源没有自动连接,在创建身份验证bean时接收空指针 原因: org.springframework.beans.BeanInstantiationException: Failed to instanceiate [com.filechecker.check.Authenticator]: Constructor threw exception;ne

  • 问题内容: 就像是有什么,但对?我要显示的数据是使用的关联。 我已经尝试使用过,但是在这种情况下,我必须在hibernate状态下使用它,这需要我指定using,并且每当我检索到through时,列表中的元素之间都会有空格,具体取决于。 我需要自动填充集合,因为我需要在创建时动态生成。当我使用plain时,得到以下内容: 还有其他解决方案吗? 编辑 我正在尝试实现动态表格 问题答案: 您无法在MV

  • 我列了一张我把动物放进去的名单。但是当我想要它们在我的ListView中时,我得到了一个奇怪的符号???我错过了什么? 我的GUI

  • 问题内容: 是否有一个Java库可以帮助创建用于测试的类的实例?一种检查bean的属性并将其填充随机数据的函数。 我基本上是在寻找Java等效于C#的对象Hydrator。 问题答案: 您可以使用PoDaM:

  • 我有一些组合框,它们在表单中具有预定义的值。但是,当用户提交表单并且我使用以下方法重置时,它工作正常: 这将在大多数区域完美地重置表单,并且组合框将再次用预定义的值重新填充,但是,如果您将值保持在新表单中并再次提交,您将收到一个“无法读取空的属性'0'”错误 我如何预填充值: 为避免此错误,用户当前需要做的是在组合框中重新选择当前选择的内容。如果我回答了以下问题之一,我觉得我可以避免这个问题: A