【问题标题】:Setting up an additonal CXFServlet with Spring Boot使用 Spring Boot 设置额外的 CXFServlet
【发布时间】:2021-03-10 17:47:12
【问题描述】:

我目前正在尝试让 CXF Servlet 与常规 Web MVC Servlet 一起运行。我的 CXF Servlet 定义了多个端点,即:

  • /api/v1/*
  • /soap/v2/*
  • /internal-api/v1/*

我还希望 Spring MVC 的 DispatcherServlet/api/v2/* 下运行

当我配置时:

 @Bean
    public ServletRegistrationBean<CXFServlet> cxfServlet() {
        final ServletRegistrationBean<CXFServlet> cxfServletServletRegistrationBean = new ServletRegistrationBean<>(new CXFServlet(), "/*");
        return cxfServletServletRegistrationBean;
    }

关于 CXF 的所有内容都可以正常工作,但 Spring Boot 应用程序中的 @Controller 不再可用。(当然现在所有内容都指向 cxfservlet)

但是当我配置时:

 @Bean
    public ServletRegistrationBean<CXFServlet> cxfServlet() {
        final ServletRegistrationBean<CXFServlet> cxfServletServletRegistrationBean = new ServletRegistrationBean<>(new CXFServlet(), "/api/v1/*");
        return cxfServletServletRegistrationBean;
    }

如果我使用诸如 http://localhost:8080/api/v1/api/v1/test 之类的 URL,现在只能访问 cxf 的端点。

如何配置 spring boot 应用程序,以便/api/v2/* 被定向到 spring mvc servlet 并且 cxf servlet 仍然像上面描述的那样工作?

【问题讨论】:

  • 可能ServletRegistrationBean 也适用于DispatcherServlet
  • 我已经尝试过了……cxf servlet 的/* url 映射仍然可以捕获所有内容,并且没有任何内容进入调度程序servlet。 cxf servlet 只响应没有找到应该映射到 @Controller 的 url 的服务
  • 你试过什么?您尝试了CXFServlet,如果您注册DispatcherServlet 以获得正确的ULR 前缀,请求将被正确路由。

标签: java spring spring-boot cxf


【解决方案1】:

手动注册调度程序 servlet 而不是让 spring boot 自动配置来解决问题:

@Configuration
public class ServletConfig {

    @Bean
    public ServletRegistrationBean<CXFServlet> cxfServlet() {
        return new ServletRegistrationBean<>(new CXFServlet(), "/*");
    }

    @Bean
    public DispatcherServlet dispatcherServlet() {
        DispatcherServlet dispatcherServlet = new DispatcherServlet();
        dispatcherServlet.setThreadContextInheritable(true);
        dispatcherServlet.setThrowExceptionIfNoHandlerFound(true);
        return dispatcherServlet;
    }

    @Bean
    public DispatcherServletRegistrationBean dispatcherServletRegistration() {
        DispatcherServletRegistrationBean registration = new DispatcherServletRegistrationBean(
                dispatcherServlet(),
                "/api/v2/*"
        );
        registration.setLoadOnStartup(0);
        registration.setName(DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME);
        return registration;
    }
}

注意,在除 /* 之外的任何地方注册 cxf servlet 都会搞砸 cxf servlet 的路由。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2016-08-28
    相关资源
    最近更新 更多