【发布时间】:2013-11-28 17:17:53
【问题描述】:
对 Spring 如何设置和使用 CXF 拦截器有疑问。我想将传入的 SOAP 请求记录到数据库以获取审计日志。我有如下设置,但是每当传入的 SOAP 请求到来时,我都会在访问服务层类的地方得到 NPE。从日志中可以看出,Web 应用程序上下文再次被重新加载,导致服务 bean 的引用为空。 我查看了两个条目 - this 和 this - 它们很接近,并在第一个链接中尝试了解决方案,但没有工作。 任何帮助表示赞赏。
谢谢
拦截器代码:
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的文件?可能不是您的问题的原因,但绝对令人困惑 -
您可以从您的 web.xml 以及您拥有的任何其他 spring 配置文件中添加摘录吗?
@Autowired正在处理其他 bean 吗? -
cxf-servlet.xml 上方存在于我的 Web 应用程序中,并且它包含的 cxf-servlet.xml 是 CXF 文件。将 web.xml 添加到问题中。是的,@Autowired 适用于 Spring MVC 控制器等其他组件
-
我希望您在 CXFServlet 的上下文和
ContextLoaderListener的上下文中都获得了/WEB-INF/cxf-servlet.xml的内容。尝试从 ContextLoaderListener 的contextConfigLocation属性中删除行/WEB-INF/cxf-servlet.xml。 -
感谢您的指导。这些 cmets 帮助解决了问题。这就是我所做的。 1. 从 web.xml 中删除 cxf-servlet 条目 2. 删除文件本身,因为仅仅删除条目没有帮助 3. 将 cxf 相关的 bean 设置移动到 applicationContext.xml。现在 bean 被识别并且 @Autowired 工作。您能否将其发布为答案,以便我接受。谢谢
标签: spring cxf interceptor autowired