Java 8 未找到自动连线bean的候选项

Java 8 未找到自动连线bean的候选项,java-8,spring-4,Java 8,Spring 4,在一个客户那里,我正在开发一个需要审计的应用程序。这些审计记录应该可以在网页中查看,我正在修改当前的现有数据以实现这一点。 Maven编译代码时没有错误,但是当调用网页显示审计记录时,我收到以下异常 04-Jan-2017 15:22:25.133 WARNING [http-nio-7443-exec-7] org.glassfish.jersey.server.spring.AutowiredInjectResolver.getBeanFromSpringContext No qualify

在一个客户那里,我正在开发一个需要审计的应用程序。这些审计记录应该可以在网页中查看,我正在修改当前的现有数据以实现这一点。 Maven编译代码时没有错误,但是当调用网页显示审计记录时,我收到以下异常

04-Jan-2017 15:22:25.133 WARNING [http-nio-7443-exec-7] org.glassfish.jersey.server.spring.AutowiredInjectResolver.getBeanFromSpringContext No qualifying bean of type 'my.company.app.audit.service.IAuditService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
04-Jan-2017 15:22:25.167 WARNING [http-nio-7443-exec-7] org.glassfish.jersey.internal.Errors.logErrors The following warnings have been detected: WARNING: Unknown HK2 failure detected:
MultiException stack 1 of 3
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'my.company.app.audit.service.IAuditService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

MultiException stack 2 of 3
java.lang.IllegalArgumentException: While attempting to resolve the dependencies of my.company.app.audit.rest.resources.AuditResource errors were found

MultiException stack 3 of 3
java.lang.IllegalStateException: Unable to perform operation: resolve on my.company.app.audit.rest.resources.AuditResource
应用程序类

package my.company.app.audit;

public class AuditApplication extends ResourceConfig {
    public AuditApplication() {
        register(AuditResource.class);
    }
}
package my.company.app.audit.rest.resources;

@Path(AUDIT_RESOURCE_LINK)
@Produces({ MediaType.APPLICATION_JSON })
public class AuditResource extends AbstractResource {
    @Autowired
    private IAuditService auditService;  // Commenting out this line results in the exception no longer popping up
}
package my.company.app.audit.service;

import org.springframework.stereotype.Service;

@Service
public class AuditService implements IAuditService {
}
资源类

package my.company.app.audit;

public class AuditApplication extends ResourceConfig {
    public AuditApplication() {
        register(AuditResource.class);
    }
}
package my.company.app.audit.rest.resources;

@Path(AUDIT_RESOURCE_LINK)
@Produces({ MediaType.APPLICATION_JSON })
public class AuditResource extends AbstractResource {
    @Autowired
    private IAuditService auditService;  // Commenting out this line results in the exception no longer popping up
}
package my.company.app.audit.service;

import org.springframework.stereotype.Service;

@Service
public class AuditService implements IAuditService {
}
服务类别

package my.company.app.audit;

public class AuditApplication extends ResourceConfig {
    public AuditApplication() {
        register(AuditResource.class);
    }
}
package my.company.app.audit.rest.resources;

@Path(AUDIT_RESOURCE_LINK)
@Produces({ MediaType.APPLICATION_JSON })
public class AuditResource extends AbstractResource {
    @Autowired
    private IAuditService auditService;  // Commenting out this line results in the exception no longer popping up
}
package my.company.app.audit.service;

import org.springframework.stereotype.Service;

@Service
public class AuditService implements IAuditService {
}
审计应用程序特定配置:Audit config.xml

<?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:context="http://www.springframework.org/schema/context"
   xmlns:jpa="http://www.springframework.org/schema/data/jpa"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context.xsd
   http://www.springframework.org/schema/data/jpa
   http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
   http://www.springframework.org/schema/aop
   http://www.springframework.org/schema/aop/spring-aop.xsd">

    <context:annotation-config/>

    <context:component-scan base-package="my.company.app.audit"/>

    <jpa:repositories base-package="my.company.app.audit" transaction-manager-ref="txManager"/>

    <aop:aspectj-autoproxy/>

</beans>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="true">

    <display-name>foo web_audit</display-name>

    <!--  SESSION -->
    <session-config>
        <session-timeout>30</session-timeout>
        <cookie-config>
            <name>WEB_AUDIT</name>
            <path>/</path>
            <http-only>true</http-only>
            <secure>true</secure>
        </cookie-config>
    </session-config>

    <!-- SPRING -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:applicationContext.xml,
            classpath:foo-json-serialization-beans.xml,
            classpath:foo-dao-jpa-beans.xml,
            classpath:foo-dao-jpa-vendor-adapter-beans.xml,
            classpath:spring/foo-jpa-services-common.xml,
            classpath:audit-config.xml,
            classpath:iam-config.xml
        </param-value>
    </context-param>
    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>

    <!-- FILTER -->
    <filter>
        <filter-name>securityHeadersFilter</filter-name>
        <filter-class>my.company.fooshared.web.filter.SecurityHeadersFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>securityHeadersFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>SSOFilter</filter-name>
        <filter-class>my.company.fooshared.webaccess.filter.WebAccessFilter</filter-class>
        <init-param>
            <param-name>acsUrl</param-name>
            <param-value>/acs</param-value>
        </init-param>
        <init-param>
            <param-name>logoutUrl</param-name>
            <param-value>/logout</param-value>
        </init-param>
        <init-param>
            <param-name>authRequestUrl</param-name>
            <param-value>/authRequest</param-value>
        </init-param>       
        <init-param>
            <param-name>spProviderId</param-name>
            <param-value>screeningutility-ci.browse.companynet.sipn.company.com</param-value>
        </init-param>
        <init-param>
            <param-name>idProviderSSOUrl</param-name>
            <param-value>https://idp.companynet.sipn.company.com/idp/profile/SAML2/POST/SSO</param-value>
        </init-param>
        <init-param>
            <param-name>cacertPath</param-name>
            <param-value>/var/lib/tomcat/cacert/</param-value>
        </init-param>
        <init-param>
            <param-name>keystoreFile</param-name>
            <param-value>/var/lib/tomcat/jks/suchannel.jks</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>SSOFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- JERSEY -->
    <servlet>
        <servlet-name>Jersey2Dispatcher</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>my.company.app.audit.AuditApplication</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey2Dispatcher</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

    <error-page>
        <location>/error.html</location>
    </error-page>

</web-app>

web.xml

<?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:context="http://www.springframework.org/schema/context"
   xmlns:jpa="http://www.springframework.org/schema/data/jpa"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context.xsd
   http://www.springframework.org/schema/data/jpa
   http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
   http://www.springframework.org/schema/aop
   http://www.springframework.org/schema/aop/spring-aop.xsd">

    <context:annotation-config/>

    <context:component-scan base-package="my.company.app.audit"/>

    <jpa:repositories base-package="my.company.app.audit" transaction-manager-ref="txManager"/>

    <aop:aspectj-autoproxy/>

</beans>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="true">

    <display-name>foo web_audit</display-name>

    <!--  SESSION -->
    <session-config>
        <session-timeout>30</session-timeout>
        <cookie-config>
            <name>WEB_AUDIT</name>
            <path>/</path>
            <http-only>true</http-only>
            <secure>true</secure>
        </cookie-config>
    </session-config>

    <!-- SPRING -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:applicationContext.xml,
            classpath:foo-json-serialization-beans.xml,
            classpath:foo-dao-jpa-beans.xml,
            classpath:foo-dao-jpa-vendor-adapter-beans.xml,
            classpath:spring/foo-jpa-services-common.xml,
            classpath:audit-config.xml,
            classpath:iam-config.xml
        </param-value>
    </context-param>
    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>

    <!-- FILTER -->
    <filter>
        <filter-name>securityHeadersFilter</filter-name>
        <filter-class>my.company.fooshared.web.filter.SecurityHeadersFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>securityHeadersFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>SSOFilter</filter-name>
        <filter-class>my.company.fooshared.webaccess.filter.WebAccessFilter</filter-class>
        <init-param>
            <param-name>acsUrl</param-name>
            <param-value>/acs</param-value>
        </init-param>
        <init-param>
            <param-name>logoutUrl</param-name>
            <param-value>/logout</param-value>
        </init-param>
        <init-param>
            <param-name>authRequestUrl</param-name>
            <param-value>/authRequest</param-value>
        </init-param>       
        <init-param>
            <param-name>spProviderId</param-name>
            <param-value>screeningutility-ci.browse.companynet.sipn.company.com</param-value>
        </init-param>
        <init-param>
            <param-name>idProviderSSOUrl</param-name>
            <param-value>https://idp.companynet.sipn.company.com/idp/profile/SAML2/POST/SSO</param-value>
        </init-param>
        <init-param>
            <param-name>cacertPath</param-name>
            <param-value>/var/lib/tomcat/cacert/</param-value>
        </init-param>
        <init-param>
            <param-name>keystoreFile</param-name>
            <param-value>/var/lib/tomcat/jks/suchannel.jks</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>SSOFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- JERSEY -->
    <servlet>
        <servlet-name>Jersey2Dispatcher</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>my.company.app.audit.AuditApplication</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey2Dispatcher</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

    <error-page>
        <location>/error.html</location>
    </error-page>

</web-app>

网络审计
30
网络审计
/
真的
真的
上下文配置位置
类路径:applicationContext.xml,
类路径:foo-json-serialization-beans.xml,
类路径:foo-dao-jpa-beans.xml,
类路径:foo-dao-jpa-vendor-adapter-beans.xml,
类路径:spring/foo-jpa-services-common.xml,
类路径:audit-config.xml,
类路径:iam-config.xml
org.springframework.web.context.ContextLoaderListener
安全头过滤器
my.company.fooshared.web.filter.SecurityHeadersFilter
安全头过滤器
/*
SSO过滤器
my.company.fooshared.webaccess.filter.WebAccessFilter
acsUrl
/acs
注销URL
/注销
authRequestUrl
/授权请求
斯普罗维德
screeningutility-ci.browse.companynet.sipn.company.com
IDProvidersURL
https://idp.companynet.sipn.company.com/idp/profile/SAML2/POST/SSO
卡塞特路径
/var/lib/tomcat/cacert/
拱顶石
/var/lib/tomcat/jks/suchannel.jks
SSO过滤器
/*
球衣调度员
org.glassfish.jersey.servlet.ServletContainer
javax.ws.rs.Application
my.company.app.audit.AuditApplication
1.
球衣调度员
/休息/*
/error.html
我以一个相似的模块为例来构建代码。另一个模块工作正常,所以我肯定错过了什么。。。 欢迎提出任何建议


当添加默认构造函数并在其中设置断点时,我注意到AuditService类的构造函数从未被调用。

自动连接类本身而不是实现的接口解决了这个问题。我没有解释为什么界面不工作

编辑

我可能已经找到了问题的原因

在修改代码时,我在maven中引入了一些新模块。这些新模块是最初包含代码的模块的子模块

Old situation:        New siuation:
audit-module           audit-module
|- src                |- persistence
|- target             |  |- src
|- pom.xml            |  |- target
                      |  |- pom.xml
                      |- service
                      |  |- src
                      |  |- target
                      |  |- pom.xml
                      |- web
                      |  |- src
                      |  |- target
                      |  |- pom.xml
                      |- pom.xml

但依赖于旧审计模块的其他模块没有更新,因此引用了新模块的父模块。这可能是Spring未正确加载AuditService类的原因

请检查@Service注释是否为org.springframework.stereotype。Service@Michal当前位置是的,我怀疑这是原因。在整个项目中都使用相同的ServletContainer类但是,我只能想到问题的两个可能原因——第一个原因是Jersey没有正确的应用程序上下文,另一个原因是Jersey有正确的上下文,但由于某种原因,类路径扫描无法选择服务类。从app start生成的日志中可以很容易地调试和/或查看这两个变体中的哪一个。非常感谢您的猜测,因为我没有这些变体:o)我可以找到行
INFO org.springframework.beans.factory.xml.XmlBeanDefinitionReader-从类路径资源[audit config.xml]加载xml bean定义
在启动日志中多次。因此,我认为你的第二个变种是原因。