找不到名为' OutputHelper'的bean的类[main.java.OutputHelper]在类路径资源

时间:2015-11-18 07:46:06

标签: spring spring-bean

我是Spring的新手。我正在创建一个简单的项目,我只使用bean调用generateOutout()方法。

IOutputGenerator接口:

package mian.java;

public interface IOutputGenerator {
    public void generateOutput();
}

CsvOutputGenerator.java(实现IOutputGenerator):

package mian.java;

public class CsvOutputGenerator implements IOutputGenerator{
    public void generateOutput(){
        System.out.println("Csv Output Generator");
     }

 }

JsonOutputGenerator.java(实现IOutputGenerator):

package mian.java;

public class JsonOutputGenerator implements IOutputGenerator {
    public void generateOutput(){
        System.out.println("Json Output Generator");
    }
}

OutputHelper.java:     包mian.java;

public class OutputHelper {
    IOutputGenerator outputGeneratorCsv;
   IOutputGenerator outputGeneratorJson;


    public void generateOutput(){
        outputGeneratorCsv.generateOutput();
        outputGeneratorJson.generateOutput();
    }

public void setOutputGenerator(IOutputGenerator     outputGeneratorCsv,IOutputGenerator outputGeneratorJson){
        this.outputGeneratorCsv = outputGeneratorCsv;
        this.outputGeneratorJson = outputGeneratorJson;
    }
}

AppViaSpring.java(主类):     包mian.java;

 import org.springframework.context.ApplicationContext;
 import org.springframework.context.support.ClassPathXmlApplicationContext;

 public class AppViaSpring {
    public static void main( String[] args )
    {
        ApplicationContext context = 
       new ClassPathXmlApplicationContext(new String[] {"Spring-Common.xml"});

        OutputHelper output = (OutputHelper)context.getBean("OutputHelper");
    output.generateOutput();

    }
}

Spring-Common.xml(main.resources包中的Bean类):

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean id="OutputHelper" class="main.java.OutputHelper">
    <property name="outputGeneratorCsv" ref="CsvOutputGenerator" />
    </bean>

    <bean id="CsvOutputGenerator" class="main.java.CsvOutputGenerator" />
    <bean id="JsonOutputGenerator" class="main.java.JsonOutputGenerator" />

</beans>

和错误是:

Exception in thread "main"     org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find     class [main.java.OutputHelper] for bean with name 'OutputHelper' defined in     class path resource [Spring-Common.xml]; nested exception is java.lang.ClassNotFoundException: main.java.OutputHelper
at     org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1141)
at     org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:524)
at     org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1177)
at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:758)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:422)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93)
at mian.java.AppViaSpring.main(AppViaSpring.java:10)
Caused by: java.lang.ClassNotFoundException: main.java.OutputHelper
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at org.springframework.util.ClassUtils.forName(ClassUtils.java:211)
at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:385)
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1138)
... 9 more

enter image description here

1 个答案:

答案 0 :(得分:0)

您忘记为JsonOutputGenerator 添加OutputHelper bean

试试这个:

<bean id="OutputHelper" class="main.java.OutputHelper">
    <property name="outputGeneratorCsv" ref="CsvOutputGenerator" />
    <property name="outputGeneratorJson" ref="JsonOutputGenerator" />
</bean>

请注意,您也可以使用context.getBean(OutputHelper.class),不需要投射

编辑:

进一步看问题。您使用的setter有两个违反javaBean约定的参数。几乎没有选择。
你只需将地图传递给设定者。
2.为每个生成器字段创建setter。
3.在构造函数中注入outputGeneratorCsv和outputGeneratorJson - 我建议这样做。在这种情况下,你必须添加带有两个参数的构造函数(比如你的setter方法)并将spring context xml修改为类似的东西:

<bean id="OutputHelper" class="main.java.OutputHelper">
  <constructor-arg ref="outputGeneratorCsv"/>
  <constructor-arg ref="outputGeneratorJson"/>
</bean>

这里还有一些信息,为什么要使用构造函数注入:

  

我们通常建议人们对所有强制协作者使用构造函数注入,并为所有其他属性使用setter注入。同样,构造函数注入确保已满足所有必需属性,并且根本无法实例化处于无效状态的对象(未通过其协作者)。换句话说,在使用构造函数注入时,您不必使用专用机制来确保设置所需的属性(除了普通的Java机制)。   Setter injection versus constructor injection