使用 Spring Boot 设置附加 CXFServlet

问题描述 投票:0回答:1

我目前正在尝试让 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;
    }

如果我使用这样的 url,则现在只能访问 cxf 的端点

http://localhost:8080/api/v1/api/v1/test

如何配置 spring boot 应用程序,以便

/api/v2/*
定向到 spring mvc servlet 并且 cxf servlet 仍然像上面描述的那样工作?

java spring spring-boot cxf
1个回答
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 的路由。

© www.soinside.com 2019 - 2024. All rights reserved.