2017-06-17 58 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