【问题标题】:@Autowired not working in CXF interceptor + Spring application@Autowired 在 CXF 拦截器 + Spring 应用程序中不起作用
【发布时间】:2013-11-28 17:17:53
【问题描述】:

对 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>

【问题讨论】:

  • 您有一个名为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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-18
    • 2021-11-05
    • 2013-11-07
    • 1970-01-01
    • 2018-04-07
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多