【问题标题】:Creating 2 beans of the same class with different constructor-args and using autowiring使用不同的构造函数参数创建同一类的 2 个 bean 并使用自动装配
【发布时间】:2016-03-02 08:55:04
【问题描述】:

您好,我在一个项目中工作,在该项目中,我需要创建 2 个相同类但构造函数参数不同的 bean 实例。现在只有“生产环境”的功能,所以我有xml文件:

<context:component-scan base-package="com.xxx.yyy" /> 
    <bean id="id1" class="someCompanySpecificURLForTheClass" scope="singleton"/>

  <bean name="name1" factory-bean="id1" factory-method="createFullClient">
    <constructor-arg index="0">
        <ref bean="someJSONBean"/>
    </constructor-arg>
    <constructor-arg value="productionEnv" index="1"/>
</bean>  

</beans>

现在我还需要包含用于测试环境的功能。所以我把xml文件改成:

<context:component-scan base-package="com.xxx.yyy" />
<context:component-scan base-package="com.zzz.yyy" /> 

 <bean id="id1" class="someCompanySpecificURLForTheClass" scope="prototype"/>

  <bean name="name1" factory-bean="id1" factory-method="createFullClient">
    <constructor-arg index="0">
        <ref bean="someJSONBean"/>
    </constructor-arg>
    <constructor-arg value="${value.name}" index="1"/>
</bean> 

在 2 个 Java 文件中,我在 setClients() 的方法和创建 someJSONBean 的对象上使用了 @Autowired 注释。

但我收到错误消息:

BeanCreationException: could not autowire method: public void com.zzz.yyy.sometthing.setClients(someCompanySpecificURLForTheClass) throws IllegalArgumentException and UnsupportedEncodingException.
nested exception is defined: NoSuchBeanDefinitionException: no unique bean of type(someCompanySpecificURLForTheClass) is defined: expected single matching bean, found 2(name1, name2).

我是 Spring 框架的新手。谁能告诉发生了什么错误,是我做错了自动装配吗?我该如何解决这个问题?

编辑: 这里 someCompanySpecificURLForTheClass 是同一个类,bean(name1 和 name2)将此 bean 用作具有不同构造函数参数的工厂 bean。
我正在使用弹簧 3.1。
经过大量搜索,我想我可以使用占位符作为构造函数参数值,对吧? 以上是正在使用的编辑过的 xml 文件。 Java 类中的更新代码: 1.

@ConfigAdapter
 class class1{

  @Autowired
  private someJSONBean obj;

  @Autowired
  @Value("${value.name:thisismyvalue}")
  public void setClients(){}
}

 @ConfigAdapter
 class class2{

  @Autowired
  private someJSONBean obj;

  @Autowired
  @Value("${value.name:thisismyvalue}")
  public void setClients(){}
}

但我收到以下错误:

ConversionNotSupportedException: failed to convert 'java.lang.string' to 'someCompanySpecificURLForTheClass'.
nested execption is IllegalStateException
Cannot convert 'java.lang.string' to 'someCompanySpecificURLForTheClass' of required type: no matching editors or conversion strategy found.

我是否错误地指定了注释值? 为什么会这样?

【问题讨论】:

  • 你收到什么样的错误?

标签: java spring spring-mvc spring-security


【解决方案1】:

您必须使用@Qualifier 注释以及@Autowired。由于您正在创建同一类的两个 bean,因此 spring 不知道 autowire 是哪一个。您可以使用@Qualifer("id/name") 注解给出提示。

@Autowired
@Qualifier("name1")
 //yourProperty

@Autowired
@Qualifier("name2")
//yourProperty

看看这个link

如果你想将两个 bean 都注入到你的类中,那么你有两个创建两个不同的属性,每个都指向一个不同的实例。

@Autowired
@Qualifer("name1")
//property1

@Autowired
@Qualifer("name2")
//property2

【讨论】:

  • 谢谢你的工作!至少没有得到任何构建错误。但是当我通过 REST 客户端执行代码并启动服务器时。我请求先假设 name1 bean,我得到数据。但是,只有在我向 name2 bean 发出请求时,才在该会话中,我没有得到任何数据。它仅在 name1 构造函数 arg (productionEnv) 中搜索。?
  • 但我也在使用范围原型(尝试使用具有 name1 和 name2 bean 的范围)但仍然相同。并且不能使用“请求”范围,因为它不是动态 Web 项目,并且由于该范围未注册而给出错误。可能是什么问题?
  • 按属性到底是什么意思?我在两个 java 文件中对我的 setClients 方法进行了 @Qualifier 注释。
  • 假设在控制器类中,您需要同一个类 w 的两个不同 id,您可以使用 getter 和 setter 创建两个文件/属性,并用 @Autowired@Qualifer("name1") 注释其中一个,另一个用@Autowired@Qualifier("name2") ,这样您就可以同时测试产品和测试环境。但是,如果您共享源代码会很有帮助。在这种情况下,更改范围将无济于事。
  • 它是同一个类,但具有不同的构造函数参数,因此它应该使用适当的参数实例化 bean。但是现在它只实例化一个bean,并且只有在向另一个bean发出请求时才使用它,当我明确提到java类中的限定符时。
猜你喜欢
  • 2022-11-29
  • 1970-01-01
  • 2015-08-22
  • 1970-01-01
  • 2011-05-26
  • 2016-03-02
  • 2021-02-01
  • 1970-01-01
  • 2015-01-31
相关资源
最近更新 更多