【问题标题】:Autowiring fails IllegalArgument un-safe operation exception自动装配失败 IllegalArgument 不安全操作异常
【发布时间】:2013-12-27 02:43:24
【问题描述】:

升级 Spring jar 后出现以下异常。

org.springframework.web.servlet.DispatcherServlet - Context initialization failed  
org.springframework.beans.factory.BeanCreationException: Error creating bean with name     'org.springframework.integration.transformer.HeaderEnricher#4': Cannot create inner bean     '(inner bean)' of type [org.springframework.integration.transformer.HeaderEnricher$MessageProcessingHeaderValueMessageProcessor] while setting constructor argument with key [#{partnerHeaderKey}]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#19': Injection of resource dependencies failed; nested exception is java.lang.IllegalArgumentException: Can not set com.follett.fheg.coursemateriallookup.coursematerial.data.dao.PartnerDAO field com.follett.fheg.coursemateriallookup.coursematerial.integration.headerenricher.PartnerHeaderEnricher.partnerDAO to org.springframework.integration.transformer.HeaderEnricher$MessageProcessingHeaderValueMessageProcessor
at org.springframework.beans.factory.support.BeanDefinitionValue Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#19': Injection of resource dependencies failed; nested exception is java.lang.IllegalArgumentException: Can not set com.follett.fheg.coursemateriallookup.coursematerial.data.dao.PartnerDAO field com.follett.fheg.coursemateriallookup.coursematerial.integration.headerenricher.PartnerHeaderEnricher.partnerDAO to org.springframework.integration.transformer.HeaderEnricher$MessageProcessingHeaderValueMessageProcessor
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:306)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1146)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:271)
... 40 more
Caused by: java.lang.IllegalArgumentException: Can not set com.follett.fheg.coursemateriallookup.coursematerial.data.dao.PartnerDAO field com.follett.fheg.coursemateriallookup.coursematerial.integration.headerenricher.PartnerHeaderEnricher.partnerDAO to org.springframework.integration.transformer.HeaderEnricher$MessageProcessingHeaderValueMessageProcessor
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150)
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:37)
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:57)
at java.lang.reflect.Field.set(Field.java:657)
at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:150)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:303)
... 44 more

根据我的阅读,我需要将 @Component 注释添加到我的 bean 和/或在我的应用程序上下文中创建 - 这些方法都没有奏效。它所指的 DAO 声明如下<bean id="partnerDAO" class="com.follett.fheg.coursemateriallookup.coursematerial.data.dao.impl.PartnerDAOImpl"/>。如果我删除@Component 注释,我会在@Autowired 下看到一条红线,并显示一条消息“必须在有效的spring bean(@Component/@Service 等)中定义自动装配成员”,但在这样做之后我仍然得到错误。

我正在使用 Spring 集成,因此在此处定义了要自动连接的 bean。

<integration:header-enricher>
        <integration:header name="#{partnerHeaderKey}" method="getPartner">
            <bean class="com.follett.fheg.coursemateriallookup.coursematerial.integration.headerenricher.PartnerHeaderEnricher"/>
        </integration:header>
    </integration:header-enricher>

感谢任何想法或帮助!谢谢。

注意:即使我没有在应用程序上下文中声明@Component&lt;bean&gt;,如果我退回到Spring 2.1.4.RELEASE,应用程序运行良好。

更新

正如 blackpanther 在下面提到的,我需要应用程序上下文中的一个元素。我没有提到我确实有这个&lt;context:component-scan base-package="com.follett.fheg.coursemateriallookup.coursematerial.integration.headerenricher" /&gt;DAO 还有另一个&lt;context:component-scan base-package="com.follett.fheg.coursemateriallookup.coursematerial.data.dao" /&gt;

【问题讨论】:

    标签: spring spring-mvc spring-integration


    【解决方案1】:

    不完全是,只是添加注释@Component 并不意味着Java 类将自动装配其属性。为了有效地使用@Component注解,你必须告诉Spring去哪里寻找这些类。这是由 Spring 配置中的 &lt;context:component-scan base-package="package.name" /&gt; 标记完成的。

    我会看看这个article,因为它可能会对你有所帮助。

    【讨论】:

    • 是的,我也有这个标签。我很抱歉没有提到它。我会更新问题。
    【解决方案2】:

    您可以在组件内的 bean 声明顶部指定 @Qualifier,如下所示。

    @Autowired
    @Qualifier("loginService")
    private ILoginService loginService;
    

    loginService 是 .xml 上下文文件中 bean 的名称。

    【讨论】:

      【解决方案3】:

      我能够通过使用 @Component 注释以及修改在上下文中创建 bean 的方式来解决此问题。

      由于某种原因,当我将&lt;bean class=""&gt; 移出&lt;integration:header&gt; 并添加ref-"" 属性时,它开始正常工作。我遇到了另一个错误,但我能够让应用程序运行。

      老路

      <integration:header-enricher>
          <integration:header name="#{partnerHeaderKey}" method="getPartner">
              <bean   class="com.follett.fheg.coursemateriallookup.coursematerial.integration.headerenricher.Partner    HeaderEnricher"/>
          </integration:header>
      </integration:header-enricher>
      

      新方法

      <integration:header-enricher>
      <integration:header name="#{partnerHeaderKey}" method="getPartner" ref="myBean">
      </integration:header>
          </integration:header-enricher>
      </integration:chain>
      <bean id="myBean"   class="com.follett.fheg.coursemateriallookup.coursematerial.integration.headerenricher.PartnerHeaderEnricher"/>
      

      【讨论】:

        猜你喜欢
        • 2012-11-20
        • 2017-04-29
        • 1970-01-01
        • 2015-08-31
        • 2011-12-18
        • 2022-01-23
        • 2022-07-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多