我有以下项目结构
-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");
}
}
类似于网络模块
我已经尝试了一些给定答案的实现。
当我让组件扫描时,扫描两个模块(删除ComponentScan过滤器)
我得到一个不明确的映射找到异常,说两个控制器方法都调度到相同的路径“/”
但是当在其中一个模块上禁用组件扫描时,管理模块确实会映射到/ admin。
当我禁用两个控制器时,我看到/ web和/ admin dispatchServlets被映射。
所以我理解异常,但我不明白如何解决这个问题。 对我来说,每个模块我必须这样做,我不想用
来映射它@RequestMapping("/admin")
在控制器类
上我还尝试在application.properties
中指定contextPath和servletPath所以我的问题是:达到我的目标的最佳方法是什么,或者我是否尝试使用spring-boot进行无法实现的目标。
修改 概念证明会很好
答案 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
中只有一个映射可用于"/"