【问题标题】:Spring Bean Compilation issueSpring Bean 编译问题
【发布时间】:2012-10-13 19:56:38
【问题描述】:

我正在尝试一些示例 Spring 代码。在这种情况下,我试图创建一个字符串并在另一个 bean 中使用它。另一个bean在一个类中设置字符串,然后当我希望调用该类时它应该打印出消息。但是,我收到一条错误消息。请有人建议这里可能有什么问题吗?

public static void main(String[] args) {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("MyConfig.xml");

SetterMessage message = (SetterMessage) applicationContext.getBean("setStringFromBean");
System.out.println(message.getMessage()); 
}

public class SetterMessage {

    private String message = null;
    /**
     * Gets message.
     */
    public String getMessage() {
        return message;
    }

    /**
     * Sets message.
     */
    public void setMessage(String message) {
        this.message = message;
    }
}

<bean id="createString" class="java.lang.String">
<constructor-arg value="Hello from a bean"</constructor-arg>
</bean>

<bean id="setStringFromBean" class="SetterMessage">
    <property name="message" ref="createString" />
</bean>

错误是

2012 年 10 月 23 日晚上 8:36:58 org.springframework.context.support.AbstractApplicationContext prepareRefresh INFO:正在刷新 org.springframework.context.support.ClassPathXmlApplicationContext@4447393f: 启动日期 [Tue Oct 23 20:36:58 BST 2012];上下文层次的根 2012 年 10 月 23 日晚上 8:36:58 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions INFO:从类路径加载 XML bean 定义 资源 [MyConfig.xml] 2012 年 10 月 23 日晚上 8:36:58 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons INFO:预实例化单例 org.springframework.beans.factory.support.DefaultListableBeanFactory@643ae941: 定义bean [defaultMessage,constructorBean,setterMessage];的根 线程“main”中的工厂层次结构异常 org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 名为“setStringFromBean”的 bean 定义在 org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:549) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1095) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:277) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 在 org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1106) 在 Main.main(Main.java:13)

【问题讨论】:

    标签: java eclipse spring


    【解决方案1】:

    您正在按名称查找 bean,但尚未设置它的名称。

    试试:

    <bean id="setStringFromBean" name="setStringFromBean" class="SetterMessage">
      <property name="message" ref="createString" />
    </bean>
    

    【讨论】:

      【解决方案2】:

      我在 xml 文件中有一个错误的注释标记,因此它没有被正确解析

      【讨论】:

      • 这不可能。如果您的 xml 不可解析,您将遇到解析异常。 ApplicationContext.getBean 按名称而不是 id 查找,并且您没有在 bean 定义上指定名称。
      【解决方案3】:

      您需要创建一个构造函数来设置“消息”属性,因为您间接告诉容器在构造函数的帮助下设置“消息”属性。因此,如果不创建构造函数,则无法设置“消息”属性值。只需执行以下操作:

      public SetterMessage(String message) {
          this.message = message;
      

      }

      【讨论】:

      • 这是错误的。 OP 没有将&lt;constructor-arg&gt; 用于SetterMessage bean,而是使用&lt;property&gt;。这将使用设置器或反射设置message。此外,他在大约三年前找到了解决方案并回答了自己的问题。
      猜你喜欢
      • 2011-06-12
      • 2020-04-13
      • 2015-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 2018-04-19
      相关资源
      最近更新 更多