Spring启动多模块servletDispatchers

时间:2015-05-18 21:36:01

标签: java spring spring-mvc servlets spring-boot

我有以下项目结构

-Project
 |-config
 |  |-modules
 |     |-admin
 |     |-web
 |- platform 

Platform是包含spring-boot启动类的项目, Platform依赖于config,config依赖于目录模块中的所有内容 Platform也是使用mvn spring-boot:run命令启动的模块。

我想要完成的事情是模块管理员和网络(两个网络应用程序)都有自己的映射,如

  • /管理
  • /网络

以下代码表示管理模块中的控制器,Web模块还包含一个类似的控制器(即点)

@Controller
public class AdminController {

    @RequestMapping("/")
    public String adminController() {
       return "admin";
    }
}

这里有一些管理模块配置的代码

@Configuration
public class Config implements EmbeddedServletContainerCustomizer {

@Autowired
protected WebApplicationContext webApplicationContext;

@Autowired
protected ServerProperties server;

@Autowired(required = false)
protected MultipartConfigElement multipartConfig;

protected DispatcherServlet createDispatcherServlet() {

    AnnotationConfigEmbeddedWebApplicationContext webContext = new AnnotationConfigEmbeddedWebApplicationContext();
    webContext.setParent(webApplicationContext);
    webContext.scan("some.base.package");
    return new DispatcherServlet(webContext);
}

protected ServletRegistrationBean createModuleDispatcher(DispatcherServlet apiModuleDispatcherServlet) {
    ServletRegistrationBean registration =
            new ServletRegistrationBean(apiModuleDispatcherServlet,
                    "/admin");

    registration.setName("admin");
    registration.setMultipartConfig(this.multipartConfig);

    return registration;
}


@Bean(name = "adminsServletRegistrationBean")
public ServletRegistrationBean apiModuleADispatcherServletRegistration() {
    return createModuleDispatcher(createDispatcherServlet());
}

public void customize(ConfigurableEmbeddedServletContainer container) {
    container.setContextPath("/admin");
}
}

类似于网络模块

我已经尝试了一些给定答案的实现。

  1. Using multiple dispatcher servlets / web contexts with spring boot
  2. Spring Boot (JAR) with multiple dispatcher servlets for different REST APIs with Spring Data REST
  3. 很多谷歌搜索
  4. 当我让组件扫描时,扫描两个模块(删除ComponentScan过滤器)

    我得到一个不明确的映射找到异常,说两个控制器方法都调度到相同的路径“/”

    但是当在其中一个模块上禁用组件扫描时,管理模块确实会映射到/ admin。

    当我禁用两个控制器时,我看到/ web和/ admin dispatchServlets被映射。

    所以我理解异常,但我不明白如何解决这个问题。 对我来说,每个模块我必须这样做,我不想用

    来映射它
    @RequestMapping("/admin")
    

    在控制器类

    我还尝试在application.properties

    中指定contextPath和servletPath

    所以我的问题是:达到我的目标的最佳方法是什么,或者我是否尝试使用spring-boot进行无法实现的目标。

    修改 概念证明会很好

2 个答案:

答案 0 :(得分:4)

所以我找到了解决方案。 你可以看看这个link

您必须在主应用程序中注册调度程序servlet,不要使用@SpringBootApplication批注。

有关完整示例,请检查项目并检查代码

编辑:本周晚些时候提供了详细的答案

答案 1 :(得分:0)

您应该做的是将AdminController和WebController放在不同的包中。

some.base.admin.package
some.base.web.package 

在相应的配置中,仅扫描您所需的包以注册DispatcherServlet

管理员配置

webContext.scan("some.base.admin.package");

Web Config

webContext.scan("some.base.web.package");

这种方式在每个WebApplicationContext的相应DispatcherServlet中只有一个映射可用于"/"