我正在使用Apache CXF在Spring Boot应用程序上实现Bottom Up Soap WS。在部署到Weblogic(12.2.1.3.0)之前,一切工作正常。问题是我尝试使用的LoggingInterceptor根本没有被执行。
第一个问题实际上是WebService实现类上@Autowired注入上的空指针。为了解决这个问题,我使用了一些我在StackO上建立的解决方法。似乎weblogic开始分离上下文加载器,一个用于spring和所有bean,另一个用于CXF。因此,当通过wsdl url调用webservice impl类时,不会完成注入。解决此问题后,WS可以正常工作,但是不会触发通过Spring Boot配置添加的日志记录拦截器。该应用程序的一项重要功能是能够将肥皂请求响应存储在数据库中。因此,拦截器链的工作非常重要。
Spring Boot配置类:
@Configuration
public class LmsReloadCXFWSConfig implements ServletContextInitializer{
private static WebApplicationContext webApplicationContext;
public static WebApplicationContext getCurrentWebApplicationContext() {
return webApplicationContext;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@Bean
public ServletRegistrationBean servletRegistration() {
return new ServletRegistrationBean(new CXFServlet(), "/*");
}
@Bean
public LoggingInInterceptor logInInterceptor() {
return new LmsReloadWSInboundInterceptor();
}
@Bean
public LoggingOutInterceptor logOutInterceptor() {
return new LmsReloadWSOutboundInterceptor();
}
@Bean(name=Bus.DEFAULT_BUS_ID)
public SpringBus springBus() {
SpringBus springBus = new SpringBus();
return springBus;
}
@Bean
public LmsReloadWebService lmsReloadWebService() {
LmsReloadWebService lmsReloadWebService = new LmsReloadWebServiceImpl();
return lmsReloadWebService;
}
@Bean
public Endpoint endpoint() {
EndpointImpl endpoint = new EndpointImpl(springBus(), lmsReloadWebService());
endpoint.getInInterceptors().add(logInInterceptor());
endpoint.getOutInterceptors().add(logOutInterceptor());
endpoint.publish("/Soap");
return endpoint;
}
}
这两个都是自定义拦截器,可扩展LoggingInInterceptor和LoggingOutInterceptor:
public class LmsReloadWSInboundInterceptor extends LoggingInInterceptor{
...
}
public class LmsReloadWSOutboundInterceptor extends LoggingOutInterceptor{
...
}
Web服务界面和实现:
@WebService(name = "LmsServiceInterface", targetNamespace=LmsReloadUtil.LMSRELOAD_NAMESPACE_ORI)
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
public interface LmsReloadWebService {
...
}
@WebService(portName = "LmsServicePort", serviceName = "Soap", targetNamespace = LmsReloadUtil.LMSRELOAD_NAMESPACE_ORI, endpointInterface = "com.dell.lms.reload.ws.LmsReloadWebService")
public class LmsReloadWebServiceImpl implements LmsReloadWebService {
@Autowired
private LmsReloadService lmsReloadService;
@Autowired
private LmsReloadLoggingService lmsReloadLoggingService;
public LmsReloadWebServiceImpl() {
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor();
WebApplicationContext currentContext = LmsReloadCXFWSConfig.getCurrentWebApplicationContext();
bpp.setBeanFactory(currentContext.getAutowireCapableBeanFactory());
bpp.processInjection(this);
}
...
}
我pom.xml上的CXF版本是3.2.7
我需要做的是使那些拦截器正常工作,以便我可以在数据库中保存请求和响应。同样,使用在Eclipse中启动的spring boot tomcat执行该应用程序时,该应用程序可以正常工作。而且由于WebService Impl类上的Autowired问题,我认为与Weblogic部署应用程序的方式有关。不同的上下文加载器。
在上个星期对这个问题进行了调查,发现了很多可能的解决方案,尝试了所有但没有成功。