Spring загрузочный мультисервер servletDispatchers - программирование

Spring загрузочный мультисервер servletDispatchers

У меня есть следующая структура проекта

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

Платформа - это проект, содержащий класс запуска spring -boot, Платформа зависит от конфигурации и конфигурации, зависящей от всех в модулях каталога Платформа также является модулем, который запускается с помощью команды mvn spring -boot: run.

То, что я пытаюсь выполнить, состоит в том, что администраторы модулей и веб-сайты (оба веб-приложения) имеют собственное сопоставление, например

  • /админ
  • /веб

Следующий код представляет собой контроллер в модуле администратора, веб-модуль также содержит аналогичный контроллер (это точка)

@Controller
public class AdminController {

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

Вот какой код для конфигурации модуля 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 получают сопоставление с /admin.

когда я отключу оба контроллера, я вижу, что сопоставления диспетчера /web и/admin сопоставляются.

Итак, я понимаю исключение, но я не понимаю, как это решить. Для меня необходимо, чтобы я мог сделать это для каждого модуля, и я не хочу сопоставлять его с помощью

@RequestMapping("/admin")

в классе контроллера

Я также попытался указать contextPath и servletPath в application.properties

Итак, мой вопрос: какой был бы лучший подход для достижения моей цели, или я пытаюсь использовать spring -boot для чего-то, чего не было для этого.

Edit Доказательство концепции было бы приятным

4b9b3361

Ответ 1

Итак, я нашел решение. Вы можете посмотреть здесь на ссылку

Вам нужно зарегистрировать сервлеты диспетчера в основном приложении и не использовать аннотацию @SpringBootApplication.

Для полного примера просто проверьте проект и проверьте код

РЕДАКТИРОВАТЬ: позже на этой неделе плохой подробный ответ

Ответ 2

Что вы должны сделать, так это поставить ваш 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 доступно только одно отображение для "/"