我有一个EquityOrder类,包含Equity列表和String作为其属性。还定义了方法“placeOrder”。我已经自动装配了我的构造函数,并且已经在我的XML文件中定义了Equity的bean。
@Autowired
public EquityOrder(String name, List<Equity> equity) {
this.name = name;
this.equity = equity;
}
public void placeOrder() {
for (Equity eq : equity)
System.out.println("Placing order for " + eq.getSecurityName()
+ "with quantity " + eq.getQuantity());
}
在xml我有下面的场景,这是没有错误的。
<context:annotation-config />
<bean name="testEquity" class="com.sapient.Spring.Equity.Equity">
<property name="symbol" value="MSFT"></property>
<property name="securityName" value="Microsoft"></property>
<property name="type" value="IT"></property>
<property name="quantity" value="100"></property>
</bean>
<bean name="testOtherEquity" class="com.sapient.Spring.Equity.Equity">
<constructor-arg value="GOOG">
</constructor-arg>
<constructor-arg value="Google"></constructor-arg>
<constructor-arg value="IT"></constructor-arg>
<constructor-arg value="100"></constructor-arg>
</bean>
<bean name="testEquityOrder" class="com.sapient.Spring.Equity.EquityOrder">
</bean>
问题 - 在构造函数中我没有String,那么项目运行正常。但是如果构造函数中包含String,则抛出异常为 -
Error creating bean with name 'testEquityOrder' defined in class path resource
[SpringConfig.xml]: Unsatisfied dependency expressed through constructor argument with
index 0 of type [java.lang.String]: : No matching bean of type [java.lang.String] found
for dependency: expected at least 1 bean which qualifies as autowire candidate for this
dependency. Dependency annotations: {}; nested exception is
org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of
type [java.lang.String] found for dependency: expected at least 1 bean which qualifies
as autowire candidate for this dependency. Dependency annotations: {}
这意味着容器正在寻找String bean但它不能存在。如何解决这个问题。一种方法是在setter上使用注释。但是如何使用Constructor上的@Autowire
注释呢?感谢
答案 0 :(得分:2)
您可以使用<constructor-arg>
元素为name属性提供值,如下所示:
<bean name="testEquityOrder" class="com.sapient.Spring.Equity.EquityOrder">
<constructor-arg value="dummyValue" />
</bean>
另一个构造函数参数无论如何都被自动装配,因为它已经定义了一个bean。
P.S。此外,我必须说EquityOrder似乎是一个数据对象,除非它是一些配置数据,否则它不应该像这样注入/自动装配,如果它取决于用户输入。