2013-11-27 1 views
2

Наличие проблемы с настройкой и использованием перехватчика CXF весной. Я хочу регистрировать входящие запросы SOAP в базу данных для журнала аудита. У меня есть настройка, как показано ниже, но всякий раз, когда поступает входящий запрос SOAP, я получаю NPE, к которому обращается класс уровня сервиса. Из журнала видно, что контекст веб-приложения снова загружается, что приводит к нулевой ссылке для служебного компонента. Я взглянул на две записи - this и this - которые близки, и опробовали решение по первой ссылке, но не работали. Любая помощь приветствуется.@ Автозапуск не работает в перехватчике CXF + Весеннее приложение

Благодаря

перехватчик Код:

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> 
+0

У вас есть файл конфигурации bean, называемый 'cxf-servlet.xml', который импортирует файл с именем' cxf-servlet.xml'? Наверное, не причина ваших проблем, но определенно запутанная. – artbristol

+0

Можете ли вы добавить выдержки из вашего web.xml и любых других файлов конфигурации пружин, которые у вас есть? Работает ли '@ Autowired' на других бобах? – artbristol

+0

выше cxf-servlet.xml присутствует в моем веб-приложении, а cxf-servlet.xml, который включает в себя файл CXF. Добавление вопроса web.xml. И да, @Autowired отлично работает для других компонентов, таких как Spring MVC-контроллеры – Pragmatic

ответ

0

Я ожидаю, что вы получаете содержание /WEB-INF/cxf-servlet.xml включены как в контексте CXFServlet и ContextLoaderListener годов. Попробуйте удалить строку /WEB-INF/cxf-servlet.xml из атрибута contextConfigLocation контекста ContextLoaderListener. Вы также должны переименовать cxf-servlet.xml, потому что CXFServlet ищет файл с таким точным именем (см. http://cxf.apache.org/docs/configuration.html) - или объедините его в остальную часть вашего applicationContext.xml.

Смежные вопросы