我的应用程序充当SOAP Web服务,还处理Web请求。这是我的网络服务配置。
@Bean
public ServletRegistrationBean messageDispatcherServlet(ApplicationContext applicationContext) {
MessageDispatcherServlet servlet = new MessageDispatcherServlet();
servlet.setApplicationContext(applicationContext);
servlet.setTransformWsdlLocations(true);
return new ServletRegistrationBean(servlet, "/ws/*");
}
我面临的问题是,当我在浏览器上输入我的Web服务URL时,我可以通过查看
成功地看到我的Web服务正在运行<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
...
</wsdl:definitions>
但是当我从SoapUI发送请求时,我收到错误404页面未找到。我该如何解决这个问题?
编辑:根据Spring Boot Reference Guide Spring WS使用不同的servlet类型来处理SOAP消息:MessageDispatcherServlet。通过命名此bean messageDispatcherServlet,它不会替换Spring Boot的默认DispatcherServlet bean。在我的情况下,我默认的DispatcherServlet是处理来自SoapUI的POST请求的那个。当我发送GET请求时,messageDispatcherServlet指示我的WS正常运行。这是我认为导致问题的原因。当我从浏览器向我的Web服务URI发送请求时,我在日志上检查了这个。
Initializing Spring FrameworkServlet 'messageDispatcherServlet'
FrameworkServlet 'messageDispatcherServlet': initialization started
Creating SAAJ 1.3 MessageFactory with SOAP 1.1 Protocol
FrameworkServlet 'messageDispatcherServlet': initialization completed in 11 ms
编辑2:我还想补充说我正在使用Spring Web Security。在与一个新的spring生产者进行了几次测试之后,我意识到在我从依赖项中添加了Spring Web Security后它停止了工作。我想知道这是否可能导致我的请求由DefaultDispatcherServlet处理。
编辑3:我可以确认这是由春季网络安全引起的。我还在努力解决它。
答案 0 :(得分:0)
您不需要单独的servlet类,只需要注册它。 尝试以下列方式实例化您的Web服务
@Configuration
@EnableWs
@ComponentScan("com.mypackage")
public class AppConfig extends WsConfigurerAdapter {
@Bean
public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema mySchema) {
DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
wsdl11Definition.setPortTypeName("portname");
wsdl11Definition.setLocationUri("/ws");
wsdl11Definition.setTargetNamespace("http://localhost/ws");
wsdl11Definition.setSchema(mySchema);
return wsdl11Definition;
}
@Bean
public XsdSchema mySchema() {
return new SimpleXsdSchema(new ClassPathResource("mySchema.xsd"));
}
WebAppInitializer类
public class WebAppInitializer implements WebApplicationInitializer {
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext appContext = new
AnnotationConfigWebApplicationContext();
appContext.register(AppConfig.class);
appContext.setServletContext(servletContext);
MessageDispatcherServlet msgServlet = new MessageDispatcherServlet();
msgServlet.setApplicationContext(appContext);
msgServlet.setTransformWsdlLocations(true);
Dynamic dynamic = servletContext.addServlet("dispatcher",servlet);
dynamic.addMapping("/ws/*");
dynamic.setLoadOnStartup(1);
}