2017-06-17 55 views
0

我的应用程序充当SOAP Web服务并处理Web请求。这是我的Web服务配置。我是否需要分离Web服务servlet和mvc servlet?

@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安全。在与一位新的Spring生产者进行了几次测试之后,我意识到在从依赖关系中添加Spring Web Security后,它停止了工作。我想知道是否这可能会导致我对DefaultDispatcherServlet处理的请求。

编辑3:我可以证实这是由于网络安全问题造成的。我仍在努力解决这个问题。

+0

如果(如果你使用的是默认的Tomcat)我没有记错的Web服务器已映射服务两个请求。这就是浏览器显示服务的原因。你看过滤吗? – efekctive

+0

@efekctive你有什么好的例子可以检查过滤吗? – Zack

+0

现在纠结了。我会回到 – efekctive

回答

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); 
} 
+0

我不明白这一点,它并没有真正的工作。 – Zack

+0

你面对什么样的问题,请详细说明。 – fg78nc

+0

没有什么变化。当我添加这个类时也是如此。 – Zack