Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在尝试使用构造函数arg元素初始化bean时会出现BeanCreationException_Java_Spring - Fatal编程技术网

Java 为什么在尝试使用构造函数arg元素初始化bean时会出现BeanCreationException

Java 为什么在尝试使用构造函数arg元素初始化bean时会出现BeanCreationException,java,spring,Java,Spring,我正在尝试创建一个不可变对象,并在spring中从xml配置文件对其进行初始化。但是我得到了一个BeanCreationException,我还不知道为什么。异常表示无法找到具有以下消息的适当构造函数: “无法解析匹配的构造函数(提示:为简单参数指定索引/类型/名称参数以避免类型歧义)” 然而,如果我将构造函数arg元素更改为使用基于索引的参数解析,它可以正常工作,但这不利于创建可读性好的配置文件。也就是说,我需要基于名称的参数解析,这样就可以很容易地看到参数对应的内容 据我所知,这一点都不含糊

我正在尝试创建一个不可变对象,并在spring中从xml配置文件对其进行初始化。但是我得到了一个BeanCreationException,我还不知道为什么。异常表示无法找到具有以下消息的适当构造函数:

“无法解析匹配的构造函数(提示:为简单参数指定索引/类型/名称参数以避免类型歧义)”

然而,如果我将构造函数arg元素更改为使用基于索引的参数解析,它可以正常工作,但这不利于创建可读性好的配置文件。也就是说,我需要基于名称的参数解析,这样就可以很容易地看到参数对应的内容

据我所知,这一点都不含糊。也就是说,只有一个双参数构造函数。它需要两个int,一个叫做'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>

属性“name”的文档显示:

注意:这需要在类文件中存储调试符号,以便内省参数名称


那么也许您没有启用调试符号

根据spring文档:
从Spring3.0开始,您还可以使用构造函数参数名来消除值歧义:请记住,要使这项工作开箱即用,您的代码必须在启用调试标志的情况下编译,以便Spring可以从构造函数中查找参数名。如果无法使用调试标志编译代码(或不希望),可以使用@ConstructorProperties JDK annotation显式命名构造函数参数。

您在哪一页找到了它?我想我无意中结束了spring.net文档,它没有提到SpringSource工具套件中的调试符号自动完成。我没想到STS中也会有xml文档。这就成功了。非常感谢。
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);       
    }

}