spring - @Autowired 在 CXF 拦截器 + Spring 应用程序中不起作用

标签 spring cxf interceptor autowired

对于 Spring 如何设置和使用 CXF 拦截器存在问题。我想将传入的 SOAP 请求记录到数据库中以获取审计日志。我有如下设置,但是每当传入的 SOAP 请求到来时,我都会在访问服务层类的地方得到 NPE。从日志中可以看出,Web 应用程序上下文正在再次重新加载,导致服务 bean 的引用为空。 我查看了两个条目 - thisthis - 很接近,并尝试了第一个链接中的解决方案,但没有用。 感谢您的帮助。

谢谢

拦截器代码:

public class AuditLogInterceptor extends AbstractLoggingInterceptor {

private AuditLogService auditLogService;

@Autowired
public void setAuditLogService(AuditLogService auditLogService) {
    this.auditLogService = auditLogService;
}
private void saveAuditLogEntry() {
    // some more code ...
    auditLogService.logRequest(logEntry);
}

cxf-servlet.xml

<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<bean id="jsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" />

<!-- Add new endpoints for additional services you'd like to expose -->
<bean id="abstractLogInterceptor" abstract="true">
    <property name="prettyLogging" value="true" />
</bean>
<bean class="com.xyz.interceptor.AuditLogInterceptor" id="logInInterceptor" parent="abstractLogInterceptor"/>

<jaxws:endpoint id="dataService" implementor="#masterDataService" address="/MasterDataService">
    <jaxws:inInterceptors>
        <ref bean="logInInterceptor" />
    </jaxws:inInterceptors>
</jaxws:endpoint>

web.xml

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:/applicationContext-resources.xml
            classpath:/applicationContext-dao.xml
            classpath:/applicationContext-service.xml
            classpath*:/applicationContext.xml
            /WEB-INF/applicationContext*.xml
            /WEB-INF/cxf-servlet.xml
            /WEB-INF/security.xml
        </param-value>
</context-param>
<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <listener>
        <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
    </listener>
    <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>
<servlet>
    <servlet-name>CXFServlet</servlet-name>
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>CXFServlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
</servlet-mapping>

最佳答案

我希望你能得到 /WEB-INF/cxf-servlet.xml 的内容包含在 CXFServlet 的上下文和 ContextLoaderListener 的上下文中。尝试删除行 /WEB-INF/cxf-servlet.xml来自 ContextLoaderListener 的 contextConfigLocation 属性。您还应该重命名 cxf-servlet.xml因为 CXFServlet 查找具有该确切名称的文件(请参阅 http://cxf.apache.org/docs/configuration.html ) - 或者将其合并到您的其余部分 applicationContext.xml .

关于spring - @Autowired 在 CXF 拦截器 + Spring 应用程序中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20241264/

相关文章:

java - OneToMany 主键列错误

java - 'ehcache 2.10.1'使用什么版本的spring?

tomcat - Apache CXF 在关闭 tomcat 时挂起

java - 在 Spring Boot 中加载 Spring 属性

java - 在时间限制后停止/中断线程

angular - 我的 Angular 应用程序中有一个http错误感官。我正在从后端捕获所有错误。如何显示所有错误?

Java Spring 在处理之前更改响应

java - 如何注册在消息转换器之前工作的RestController拦截器?

JAVA 1.8 和 WebSphere 8..5.5.11 - Spring 和 Apache CXF 兼容版本

java - CXF 生成的 WSDL 不包含 WS-SecurityPolicy 定义