Spring隐式构造函数注入在Tomcat中不起作用

问题描述

@H_404_0@我正在使用Spring(5.2.6.RELEASE),Tomcat(8.5.29)和Apache CXF(3.3.6)开发Web应用程序。在集成测试中(使用JUnit 4.13),Spring的隐式构造函数注入效果很好,但是当我将Web应用程序部署到活动的Tomcat服务器时,会收到如下错误消息:

[...] Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'foo.bar.UserService#35fa8149' defined in ServletContext resource [/WEB-INF/context.xml]: Instantiation of bean Failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [foo.bar.UserService]: No default constructor found; nested exception is java.lang.NoSuchMethodException: foo.bar.UserService.<init>()
        at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.instantiateBean(AbstractAutowireCapablebeanfactory.java:1320) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.createBeanInstance(AbstractAutowireCapablebeanfactory.java:1214) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.doCreateBean(AbstractAutowireCapablebeanfactory.java:557) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.createBean(AbstractAutowireCapablebeanfactory.java:517) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
        at org.springframework.beans.factory.support.BeanDeFinitionValueResolver.resolveInnerBean(BeanDeFinitionValueResolver.java:374) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
        ... 30 more
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [foo.bar.UserService]: No default constructor found; nested exception is java.lang.NoSuchMethodException: foo.bar.UserService.<init>()
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:83) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.instantiateBean(AbstractAutowireCapablebeanfactory.java:1312) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.createBeanInstance(AbstractAutowireCapablebeanfactory.java:1214) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.doCreateBean(AbstractAutowireCapablebeanfactory.java:557) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.createBean(AbstractAutowireCapablebeanfactory.java:517) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
        at org.springframework.beans.factory.support.BeanDeFinitionValueResolver.resolveInnerBean(BeanDeFinitionValueResolver.java:374) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
        ... 30 more
Caused by: java.lang.NoSuchMethodException: foo.bar.UserService.<init>()
        at java.lang.class.getConstructor0(Class.java:3082) ~[?:1.8.0_252]
        at java.lang.class.getDeclaredConstructor(Class.java:2178) ~[?:1.8.0_252]
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:78) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.instantiateBean(AbstractAutowireCapablebeanfactory.java:1312) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.createBeanInstance(AbstractAutowireCapablebeanfactory.java:1214) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.doCreateBean(AbstractAutowireCapablebeanfactory.java:557) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.createBean(AbstractAutowireCapablebeanfactory.java:517) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
        at org.springframework.beans.factory.support.BeanDeFinitionValueResolver.resolveInnerBean(BeanDeFinitionValueResolver.java:374) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
        ... 30 more
@H_404_0@有人知道我在做什么错吗?我没有在任何代码中使用@Autowired批注,但是在集成测试代码中使用了它-会有所作为吗?

@H_404_0@ 编辑:以下是“生产”和“集成测试”上下文XML文件

@H_404_0@“生产”:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxrs="http://cxf.apache.org/jaxrs"
       xmlns:jdbc="http://www.springframework.org/schema/jdbc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
            http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd">
  <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="environment">
      <bean class="org.springframework.web.context.support.StandardServletEnvironment"/>
    </property>
  </bean>
  <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
    [...]
  </bean>
  <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerfactorybean">
    [...]
  </bean>
  <jdbc:initialize-database data-source="dataSource" enabled="true">
    [...]
  </jdbc:initialize-database>
  <jaxrs:server address="/">
    <jaxrs:providers>
      <bean class="com.fasterxml.jackson.jaxrs.json.JacksonjsonProvider">
        <constructor-arg>
          <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperfactorybean"/>
        </constructor-arg>
      </bean>
      [other providers omitted]
    </jaxrs:providers>
    <jaxrs:serviceBeans>
      <bean class="foo.bar.UserService">
        <constructor-arg ref="entityManagerFactory"/>
        [...]
      </bean>
      [other service beans omitted]
    </jaxrs:serviceBeans>
  </jaxrs:server>
</beans>
@H_404_0@“集成测试”:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxrs="http://cxf.apache.org/jaxrs"
       xmlns:jaxrs-client="http://cxf.apache.org/jaxrs-client"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd http://cxf.apache.org/jaxrs-client http://cxf.apache.org/schemas/jaxrs-client.xsd">
  <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerfactorybean">
    <property name="dataSource">
      <bean class="org.apache.commons.dbcp2.BasicDataSource">
        [...]
      </bean>
    </property>
    [...]
  </bean>
  [test classes omitted]
  <bean id="jsonProvider" class="com.fasterxml.jackson.jaxrs.json.JacksonjsonProvider">
    <constructor-arg>
      <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperfactorybean"/>
    </constructor-arg>
  </bean>
  <jaxrs:server address="local://api">
    <jaxrs:providers>
      <ref bean="jsonProvider"/>
      [other providers omitted]
    </jaxrs:providers>
    <jaxrs:serviceBeans>
      <bean class="foo.bar.UserService"/>
      [other service beans omitted]
    </jaxrs:serviceBeans>
  </jaxrs:server>
  <jaxrs-client:client id="webClient" address="local://api" serviceClass="org.apache.cxf.jaxrs.client.WebClient">
    <jaxrs-client:providers>
      <ref bean="jsonProvider"/>
    </jaxrs-client:providers>
    <jaxrs-client:headers>
      <entry key="Content-Type" value="application/json"/>
    </jaxrs-client:headers>
  </jaxrs-client:client>
</beans>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)