Java Spring boot多模块servletDispatchers

Java Spring boot多模块servletDispatchers,java,spring,spring-mvc,servlets,spring-boot,Java,Spring,Spring Mvc,Servlets,Spring Boot,我有以下项目结构 -Project |-config | |-modules | |-admin | |-web |- platform 平台是包含spring启动类的项目, 平台依赖于config,而config依赖于目录模块中的所有内容 平台也是使用mvn spring boot:run命令启动的模块 我试图实现的是,模块admin和web(都是web应用程序)有自己的映射,如 /管理员 /网 下面的代码表示管理模块中的一个控制器,web模块还包含一个类似

我有以下项目结构

-Project
 |-config
 |  |-modules
 |     |-admin
 |     |-web
 |- platform 
平台是包含spring启动类的项目, 平台依赖于config,而config依赖于目录模块中的所有内容 平台也是使用mvn spring boot:run命令启动的模块

我试图实现的是,模块admin和web(都是web应用程序)有自己的映射,如

  • /管理员
  • /网
下面的代码表示管理模块中的一个控制器,web模块还包含一个类似的控制器(这就是重点)

下面是一些用于配置管理模块的代码

@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");
}
}
web模块也有类似的功能

我已经试过实现一些给定的答案

  • 还有大量的谷歌搜索
  • 当我让组件扫描时,扫描两个模块(卸下组件扫描过滤器)

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

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

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

    所以我理解这个例外,但我不知道如何解决这个问题。 对我来说,这是一个必须的,我可以这样做每个模块,我不想使用地图

    @RequestMapping("/admin")
    
    关于控制器类

    我还尝试在application.properties中指定contextPath和servletPath

    所以我的问题是:实现我的目标最好的方法是什么,或者我是在尝试使用SpringBoot来完成它不需要的事情

    编辑
    概念验证很好

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

    some.base.admin.package
    some.base.web.package 
    
    在相应的配置中,只扫描所需的包以注册DispatcherServlet

    管理配置

    webContext.scan("some.base.admin.package");
    
    网络配置

    webContext.scan("some.base.web.package");
    
    这样,在相应的
    WebApplicationContext
    中,对于每个
    DispatcherServlet
    只有一个映射可用于
    “/”
    ,因此我找到了解决方案。 你可以看看这个

    您必须在主应用程序中注册dispatcher servlet,并且不要使用@SpringBootApplication注释

    对于完整的示例,只需签出项目并检查代码


    编辑:本周晚些时候,我将提供一个详细的答案

    我将它们放在单独的软件包中,甚至是单独的模块中。扫描方法对我也不起作用。
    webContext.scan("some.base.web.package");