각각 고유한 @Controller가 있는 여러 DispatcherServlet을 사용하는 스프링 부팅
기본적으로 저는 제 지원서를 두 부분으로 나누고 싶습니다.각 부품에는 자체 보안 기능이 있으며,@Controller
더@Services
두 부분에서 모두 액세스할 수 있어야 합니다.
그래서 저는 2개를 받아야겠다고 생각했습니다.DispatcherServlet
원 리스닝 투 리스닝/admin/*
그리고 다른 모든 것을 듣는 두 번째 (/
. 그것들은 각각 그들만의 것을 가질 것입니다.AnnotationConfigWebApplicationContext
그래서 나는 그것을 위해 별도의 구성 요소 스캔을 할 수 있습니다.@Controller
s.
그리고 스프링 부츠는 하나를 제공하기 때문입니다.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;
}
}
- 그
exclude
Spring 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
'programing' 카테고리의 다른 글
scss/css에서 파일 이름 "_" 또는 "_" 앞에 붙이는 이유는 무엇입니까? (0) | 2023.08.01 |
---|---|
사용자가 C# + As에서 Active Directory 그룹에 속해 있는지 확인합니다.그물 (0) | 2023.08.01 |
컨테이너 보기를 프로그래밍 방식으로 추가하는 방법 (0) | 2023.06.22 |
스프링 부트 상태 비저장 필터가 두 번 호출되는 이유는 무엇입니까? (0) | 2023.06.22 |
DisplayAttribute를 표시하려면 어떻게 해야 합니다.설명 특성 값? (0) | 2023.06.22 |