org.springframework.beans.factory.parsing.BeanDefinitionParsingException,bean定义解析异常期间出现意外故障

时间:2015-08-19 18:42:13

标签: java spring

尝试运行Simple Spring Application并获得异常。

Car.java

public class Car {

    private String carname;
    private Engine engine;
    public Car() {
        System.out.println("Car Class..");
    }

    public void setCarname(String carname) {
        this.carname = carname;
    }
    public void setEngine(Engine engine) {
        this.engine = engine;
    }

    public void printCarData(){
        System.out.println("Car Name : "+carname);
        System.out.println("Model Year : "+engine.getModelyear());
    }
}

引擎.java

public class Engine {

    private String modelyear;
    public Engine() {
        System.out.println("Engine Class..");
    }

    public String getModelyear() {
        return modelyear;
    }

    public void setModelyear(String modelyear) {
        this.modelyear = modelyear;
    }

}

employee.xml

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" 
            "http://www.springframework.org/dtd/spring-beans-2.0.dtd">


<beans>

    <bean id="e"  name="beans.Engine" class="beans.Engine">
        <property name="modelyear" value="2015"  />

    </bean>

</beans>

car.xml

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" 
            "http://www.springframework.org/dtd/spring-beans-2.0.dtd">


<beans>

    <bean id="c" name="beans.Car" class="beans.Car">

        <property name="carname" value="Acura"></property>
        <property name="engine" value="e"></property>
    </bean>

</beans>

Client.java

public class client {

    public static void main(String[] args) {

        String files[] = new String[]{"resources/car.xml","resources/engine.xml"};
        //Resource resource = new ClassPathResource(files);
        ApplicationContext app = new ClassPathXmlApplicationContext(files);//eager container

    }

}

错误......

Exception in thread "main" org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unexpected failure during bean definition parsing
Offending resource: class path resource [resources/car.xml]
Bean 'c'; nested exception is org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: <constructor-arg> element must specify a ref or value
Offending resource: class path resource [resources/car.xml]
Bean 'c'
    -> Constructor-arg
    at org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:68)
    at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:85)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.error(BeanDefinitionParserDelegate.java:291)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseBeanDefinitionElement(BeanDefinitionParserDelegate.java:497)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseBeanDefinitionElement(BeanDefinitionParserDelegate.java:396)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseBeanDefinitionElement(BeanDefinitionParserDelegate.java:365)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.processBeanDefinition(DefaultBeanDefinitionDocumentReader.java:259)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseDefaultElement(DefaultBeanDefinitionDocumentReader.java:154)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:133)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:93)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:212)
    at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:126)
    at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:92)
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130)
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:465)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:395)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93)
    at test.client.main(client.java:14)
Caused by: org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: <constructor-arg> element must specify a ref or value
Offending resource: class path resource [resources/car.xml]
Bean 'c'
    -> Constructor-arg
    at org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:68)
    at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:85)
    at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:80)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.error(BeanDefinitionParserDelegate.java:284)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parsePropertyValue(BeanDefinitionParserDelegate.java:938)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseConstructorArgElement(BeanDefinitionParserDelegate.java:800)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseConstructorArgElements(BeanDefinitionParserDelegate.java:684)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseBeanDefinitionElement(BeanDefinitionParserDelegate.java:481)
    ... 22 more

1 个答案:

答案 0 :(得分:1)

在你的car.xml中更改:

<property name="engine" value="e"></property>

为:

<property name="engine" ref="e"></property>

原因:

您的bean e属于Engine类型。这正是您的Car构造函数所期望的,而不是值为“e”的String。