我正在尝试创建一个不可变的对象,并在春季通过xml配置文件初始化它。但是我得到了一个BeanCreationException,我还没有弄清楚原因。异常声明它找不到具有以下消息的适当构造函数:
“无法解析匹配的构造函数(提示:为简单参数指定索引/类型/名称参数以避免类型歧义)”
但是,如果我将构造函数-arg元素更改为使用基于索引的参数解析,它可以正常工作,但这不会使配置文件具有良好的可读性。也就是说,我想要基于名称的参数解析,这样就可以很容易地看到参数对应的内容。
据我所见,一点也不含糊。也就是说,只有一个两个args构造函数。它需要两个ints,一个叫做'a‘和一个叫做'b',这正是bean元素指定的
所有的文件都是UTF-8编码,所以不会出现编码问题.
例外情况:
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'constructorTest' defined in class path resource [ApplicationContext.xml]: Could not resolve matching constructor (hint: specify index/type/name arguments for simple parameters to avoid type ambiguities)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:250)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1003)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:907)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
at com.alertme.energysmart.service.TestClass.main(TestClass.java:50)conifg提取物:
<bean id="constructorTest" class="testpackage.TestClass">
<constructor-arg name="a" value="0" type="int" />
<constructor-arg name="b" value="1" type="int" />
</bean>
<bean id="propertyTest" class="testpackage.TestClass">
<property name="a" value="0" />
<property name="b" value="1" />
</bean>类:
package testpackage;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import com.alertme.lang.IgnoreNullsShortPrefixStyle;
public class TestClass {
private int a;
private int b;
public TestClass() {
// java bean
}
/**
* This is the targeted constructor
*/
public TestClass(int a, int b) {
this.a = a;
this.b = b;
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public void setB(int b) {
this.b = b;
}
public int getB() {
return b;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, IgnoreNullsShortPrefixStyle.get());
}
public static void main(String[] args) {
final BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("ApplicationContext.xml"));
final TestClass bean = (TestClass) beanFactory.getBean("constructorTest");
System.out.println(bean);
}
}发布于 2011-06-08 12:07:47
属性"name“的文档中写着:
注意:这需要将调试符号存储在类文件中,以便内省参数名称!
所以也许你没有启用调试符号?
发布于 2013-12-20 17:40:12
根据spring :从Spring3.0开始,您还可以使用构造函数参数名称来消除值的歧义:请记住,要使这一工作不受限制,必须在启用调试标志的情况下编译代码,以便Spring可以从构造函数中查找参数名。如果不能使用调试标志编译代码(或者不想编译),可以使用@ConstructorProperties JDK注释显式地命名构造函数参数。
https://stackoverflow.com/questions/6278358
复制相似问题