我需要将Web服务servlet和mvc servlet分开吗?

时间:2017-06-17 22:14:32

标签: java spring servlets spring-boot

我的应用程序充当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:我可以确认这是由春季网络安全引起的。我还在努力解决它。

1 个答案:

答案 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);  
}