【问题标题】:Do I need to separate web service servlet and mvc servlet?我需要将 Web 服务 servlet 和 mvc servlet 分开吗?
【发布时间】:2017-06-17 22:14:31
【问题描述】:

我的应用程序用作 SOAP Web 服务并处理 Web 请求。这是我的网络服务配置。

@Bean
public ServletRegistrationBean messageDispatcherServlet(ApplicationContext applicationContext) {
    MessageDispatcherServlet servlet = new MessageDispatcherServlet();
    servlet.setApplicationContext(applicationContext);
    servlet.setTransformWsdlLocations(true);
    return new ServletRegistrationBean(servlet, "/ws/*");
}

我面临的问题是,当我在浏览器上输入我的网络服务 URL 时,我可以通过查看成功看到我的网络服务正在运行

<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: 我可以确认这是由 Spring Web Security 引起的。我仍在研究如何解决它。

【问题讨论】:

  • 如果我没记错的话,Web 服务器(如果您使用的是默认设置,则为 tomcat)已被映射为同时处理这两个请求。这就是浏览器显示服务的原因。你看过过滤吗?
  • @efekctive 你有什么好的例子可以检查过滤吗?
  • 现在纠结了。我一会儿再回来

标签: java spring servlets spring-boot


【解决方案1】:

你不需要单独的 servlet 类,你只需要注册它。 尝试通过以下方式实例化您的网络服务

@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);  
}  

【讨论】:

  • 我不明白这个,它并没有真正起作用。
  • 你遇到什么样的问题,请详细说明。
  • 没有任何变化。添加此类时的情况相同。
  • 你能从浏览器测试它吗?
  • 是的,如前所述,当我从浏览器发送请求时,我得到了响应。
猜你喜欢
  • 2013-04-11
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
  • 2011-08-03
  • 2013-12-13
  • 2011-08-21
  • 2016-01-24
相关资源
最近更新 更多