【问题标题】:Spring Boot: separate WS and MVC requests handlingSpring Boot:分离 WS 和 MVC 请求处理
【发布时间】:2018-08-10 07:50:40
【问题描述】:

有一个结合了 WS 和 MVC 的 Spring Boot 应用程序。我的问题是如何将 WS 请求和 MVC 请求路由到不同的调度程序 servlet。这是一个代码sn-p:

(不工作):

@Configuration
public class WebServicesConfiguration extends WsConfigurerAdapter implements WebApplicationInitializer {

    @Bean
    public ServletRegistrationBean messageDispatcherServlet(ApplicationContext context) {
        MessageDispatcherServlet servlet = new MessageDispatcherServlet();
        servlet.setApplicationContext(context);
        servlet.setTransformWsdlLocations(true);

        return new ServletRegistrationBean(servlet, "/*");
    }

    @Bean
    public SimpleUrlHandlerMapping simpleUrlHandlerMapping() {
        SimpleUrlHandlerMapping handler = new SimpleUrlHandlerMapping();
        handler.setDefaultHandler("mvc");

        return handler;
    }

    @Override
    public void onStartup(ServletContext servletContext) {
        DispatcherServlet ds = new DispatcherServlet(new GenericWebApplicationContext());
        ServletRegistration.Dynamic appServlet = servletContext.addServlet("mvc", ds);
        appServlet.addMapping("/dummy");
    }
}

WS 使用'/*' 映射。此示例中的 MVC 使用 '/dummy' 映射。问题是 MVC 请求转到 WS 调度程序 servlet。我尝试使用 SimpleUrlHandlerMapping 将 MVC 请求路由到 MVC 调度程序 servlet,但它没有帮助。不允许更改 WS 的映射。

附:上面有一个错误。 WS 映射是'/'

【问题讨论】:

  • DispatcherServlet 映射到/* 并将MessageDispatcherServlet 映射到/services/* 之类的东西。另外/dummy 表示/dummy 而不是/dummy/123 等那些去WS 的。如果你使用/*作为DispatcherServlet映射你可以使用默认的spring boot配置一个,只需要配置MessageDispatcherServlet
  • 我不是想帮你,但我真的很想知道你为什么不使用不同的控制器? WS 的 restController 和 MVC 的普通控制器 ..
  • 正如我所写,更改 MessageDispatcherServlet 映射是不可能的。我只能玩 mvc 映射。

标签: java spring spring-mvc spring-ws


【解决方案1】:

找到了解决方案。我在引导类的注释中添加了以下排除项

@SpringBootApplication(exclude = DispatcherServletAutoConfiguration.class)

并通过以下方式更改 WebServicesConfiguration 类:

@Configuration
public class WebServicesConfiguration extends WsConfigurerAdapter {

    @Bean
    public ServletRegistrationBean mvcDispatcherServlet(ApplicationContext context) {
        DispatcherServlet servlet = new DispatcherServlet();
        servlet.setApplicationContext(context);

        return new ServletRegistrationBean(servlet, "/dummy");
    }

    @Bean
    public ServletRegistrationBean messageDispatcherServlet(ApplicationContext context) {
        MessageDispatcherServlet servlet = new MessageDispatcherServlet();
        servlet.setApplicationContext(context);
        servlet.setTransformWsdlLocations(true);

        return new ServletRegistrationBean(servlet, "/");
    }
}

【讨论】:

  • 在这种情况下是否可以确保首先调用mvcDispatcherServlet,以确保在'/' MessageDispatcherServlet 消费请求之前检查对'/dummy'的url请求?
猜你喜欢
  • 1970-01-01
  • 2015-04-28
  • 1970-01-01
  • 2019-02-28
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多