@Autowired 在 CXF 拦截器 + Spring 应用中无法工作

3
我有一个问题,关于如何设置和使用CXF拦截器与Spring的配合存在问题。我想要记录传入的SOAP请求到数据库以进行审计日志。我已经按照以下设置进行了设置,但每当传入SOAP请求时,我都会遇到NPE,在访问服务层类时出现。从日志中看,Web应用程序上下文被重新加载,导致服务bean的空引用。 我查看了两个条目 - 这个这个 - 两者很接近,并尝试了第一个链接中的解决方案,但不起作用。 感谢任何帮助。
谢谢。
拦截器代码:
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>

你有一个名为cxf-servlet.xml的bean配置文件,它导入了一个名为cxf-servlet.xml的文件吗?这可能不是问题的原因,但肯定会让人感到困惑。 - artbristol
你能添加你的web.xml和其他Spring配置文件的摘录吗?@Autowired在其他bean上是否起作用? - artbristol
上面的cxf-servlet.xml文件存在于我的Web应用程序中,它包含的cxf-servlet.xml是CXF文件。将web.xml添加到问题中。是的,@Autowired对其他组件(如Spring MVC控制器)也可以正常工作。 - Pragmatic
我猜你在CXFServlet的上下文和ContextLoaderListener中都包含了/WEB-INF/cxf-servlet.xml的内容。尝试从ContextLoaderListener的contextConfigLocation属性中删除/WEB-INF/cxf-servlet.xml这一行。 - artbristol
感谢您的指导。这些评论帮助解决了问题。这是我所做的。1. 从web.xml中删除cxf-servlet条目2. 删除文件本身,因为仅删除条目并没有帮助3. 将与cxf相关的bean设置移动到applicationContext.xml。现在,这些bean被识别并且@Autowired起作用。您能否将其发布为答案,以便我接受它。谢谢。 - Pragmatic
1个回答

0

我猜你在CXFServlet的上下文和ContextLoaderListener中都包含了/WEB-INF/cxf-servlet.xml的内容。尝试从ContextLoaderListener的contextConfigLocation属性中删除/WEB-INF/cxf-servlet.xml这一行。你还应该将cxf-servlet.xml重命名,因为CXFServlet会寻找一个具有完全相同名称的文件(参见http://cxf.apache.org/docs/configuration.html),或者将其合并到你的applicationContext.xml中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接