Ответ 1
Я как-то работает!
Вот мой макет пакета:
test.foo.
FooConfig.java
FooController.java
test.bar.
BarConfig.java
BarController.java
test.app.
Application.java
MyService.java
src/main/resources/application.properties
Application.java:
@SpringBootApplication(exclude=DispatcherServletAutoConfiguration.class)
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
@Bean
public ServletRegistrationBean foo() {
DispatcherServlet dispatcherServlet = new DispatcherServlet();
AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
applicationContext.register(FooConfig.class);
dispatcherServlet.setApplicationContext(applicationContext);
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(dispatcherServlet, "/foo/*");
servletRegistrationBean.setName("foo");
return servletRegistrationBean;
}
@Bean
public ServletRegistrationBean bar() {
DispatcherServlet dispatcherServlet = new DispatcherServlet();
AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
applicationContext.register(BarConfig.class);
dispatcherServlet.setApplicationContext(applicationContext);
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(dispatcherServlet, "/bar/*");
servletRegistrationBean.setName("bar");
return servletRegistrationBean;
}
}
-
excludeне позволяет Spring Boot создавать собственныйDispatcherServletс/mapping. Вы можете удалить эту строку, если вы хотите, чтобы это сопоставление или определило вашу собственную. - Вы можете добавить
servletRegistrationBean.setLoadOnStartup(1)если вы хотите, чтобы ваши сервлеты были инициализированы при запуске приложения. Иначе он будет ждать первого запроса на этот сервлет. - Важно установить
servletRegistrationBean.setName(...), иначе сервлеты будут переопределять друг друга.
FooConfig.java & BarConfig.java:
@Configuration @ComponentScan @EnableWebMvc
public class FooConfig { }
-
@EnableWebMvcвключит сканирование компонентов. Без этого он не найдет класс@Controller.
Код контроллера и службы не важен. Вам просто нужно знать, что если у вас есть @RequestMapping("/foo") внутри FooController, запрос должен быть GET/foo/foo поскольку сопоставление URL сервлета является /foo/*. Невозможно вызвать URL GET/foo потому что для URL-адреса сервлета требуется / в конце его пути (другими словами: GET/foo будет искать сервлет с / mapping!), Хотя @RequestMapping("") должен быть вызван через GET/foo/. И, конечно, невозможно было использовать /foo или /foo* качестве отображения сервлета (или я просто не нашел правильных настроек для этого)
Область применения: Контроллеры не могут видеть друг друга, хотя это не представляется возможным @Autowired их друг в друге. Также служба не может @Autowired любого из контроллеров. Но контроллеры могут @Autowired службы.
Хотя это классическая иерархия родительского дочернего контекста.
Единственное "плохое" - это то, что нам нужно @EnableMvcConfig и не получить автоматически настроенный сахар из Spring boot в контексте. Родительский контекст автоматически настраивается. Я поместил материал базы данных в application.properties и сделал запрос в MyService который вызвал FooController и он работал безупречно! :)
Надеюсь, это поможет некоторым людям!