programing

각각 고유한 @Controller가 있는 여러 DispatcherServlet을 사용하는 스프링 부팅

firstcheck 2023. 6. 22. 23:59
반응형

각각 고유한 @Controller가 있는 여러 DispatcherServlet을 사용하는 스프링 부팅

기본적으로 저는 제 지원서를 두 부분으로 나누고 싶습니다.각 부품에는 자체 보안 기능이 있으며,@Controller@Services두 부분에서 모두 액세스할 수 있어야 합니다.

그래서 저는 2개를 받아야겠다고 생각했습니다.DispatcherServlet원 리스닝 투 리스닝/admin/*그리고 다른 모든 것을 듣는 두 번째 (/. 그것들은 각각 그들만의 것을 가질 것입니다.AnnotationConfigWebApplicationContext그래서 나는 그것을 위해 별도의 구성 요소 스캔을 할 수 있습니다.@Controllers.

그리고 스프링 부츠는 하나를 제공하기 때문입니다.DispatcherServlet에 귀 기울이는./처음부터 두 번째를 추가할 수 있다고 생각했습니다.

@Configuration
public class MyConfig {
    @Bean(name="myDS")
    public DispatcherServlet myDS(ApplicationContext applicationContext) {
        AnnotationConfigWebApplicationContext webContext = new AnnotationConfigWebApplicationContext();
        webContext.setParent(applicationContext);
        webContext.register(MyConfig2.class);
        // webContext.refresh();
        return new DispatcherServlet(webContext);
    }

    @Bean
    public ServletRegistrationBean mySRB(@Qualifier("myDS") DispatcherServlet dispatcherServlet) {
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(dispatcherServlet);
        servletRegistrationBean.addUrlMappings("/admin/*");
        servletRegistrationBean.setName("adminServlet");
        return servletRegistrationBean;
    }
}

MyConfig2클래스, 오직 has만 있습니다.@Configuration그리고.@ComponentScan동일한 패키지 내에는@Controller.

애플리케이션을 시작할 때, 나는 두 번째 서블릿 매핑이 등록되는 것을 볼 수 있지만,@Controller아닙니다.또한 이제 모든 데이터에 액세스할 수 있습니다. @Controllers부터/ 그리고. /admin.


어떻게 하면 이 일을 해낼 수 있을까요?

어떻게든 작동이 됐어요!

다음은 내 패키지 레이아웃:

test.foo.
         FooConfig.java
         FooController.java
test.bar.
         BarConfig.java
         BarController.java
test.app.
         Application.java
         MyService.java
src/main/resources/application.properties

어플.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;
    }
}
  • excludeSpring Boot가 자체적으로 생성하는 것을 방지합니다.DispatcherServlet와 함께/지도 제작매핑을 원하거나 고유한 매핑을 정의할 경우 해당 선을 제거할 수 있습니다.
  • 추가할 수 있습니다.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의 서블릿을 찾습니다./매핑!), 하지만.@RequestMapping("")를 통해 호출해야 합니다.GET /foo/그리고 물론 사용할 수 없었습니다./foo또는/foo*서블릿 매핑으로(또는 그것에 대한 올바른 설정을 찾지 못했습니다)

범위: 컨트롤러가 서로를 볼 수 없지만 서로를 볼 수는 없습니다.@Autowired그들은 서로에게 있어요.또한 서비스는 할 수 없습니다.@Autowired임의의 컨트롤러.하지만 컨트롤러는@Autowired군 복무

고전적인 부모 자식 컨텍스트 계층이지만,

유일한 "나쁜" 것은 우리가 필요로 하는 것입니다.@EnableMvcConfig컨텍스트 내에서 Spring boot에서 자동으로 구성된 설탕을 가져오지 마십시오.상위 컨텍스트가 자동 구성됩니다.는 나는데이를다니넣습었개몇에 를 몇 개.application.properties그리고 안에서 질문을 했습니다.MyService은 의불진려해로 .FooController그리고 완벽하게 작동했습니다! :)

이것이 몇몇 사람들에게 도움이 되기를 바랍니다!

언급URL : https://stackoverflow.com/questions/30670327/spring-boot-with-multiple-dispatcherservlet-each-having-their-own-controllers

반응형