[SPRING] Spring 데이터 수신 REST URL에서 작동하지 않는 Spring 인터셉터
SPRINGSpring 데이터 수신 REST URL에서 작동하지 않는 Spring 인터셉터
Spring Data Rest와 JPA로 프로젝트를 진행하고 있으며 HTTP 인터셉터를 설정하려고합니다. 레퍼런스 문서들에 따르면, 스프링 웹 MVC Docs - Handler Mapping Interceptor에서 사용할 수 있도록 다음과 같이 HandlerInterceptorAdapter를 확장하는 구성 요소를 만들었습니다.
@Component
public class DBEditorTenantInterceptor extends HandlerInterceptorAdapter {
Logger logger = LoggerFactory.getLogger(DBEditorTenantInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
logger.debug("********** INTERCEPTION SUCCESSFUL **********");
return true;
}
}
그런 다음 WebMvcConfig를 확장하여 인터셉터를 등록합니다 (Spring Web MVC Docs - Config Interceptors
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Autowired
DBEditorTenantInterceptor dbEditorTenantInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(dbEditorTenantInterceptor)
.addPathPatterns("/**");
}
}
/ helloworld와 같은 스프링 데이터 REST에서 사용하지 않는 URL에 HTTP 요청을 발행하면 인터셉터가 예상대로 작동합니다. 로거 출력을 볼 수 있습니다.
017-10-26 13:16:24.689 DEBUG 17012 --- [p-nio-80-exec-4] c.c.v.d.DBEditorTenantInterceptor : ********** INTERCEPTION SUCCESSFUL **********
그러나 URL이 봄 데이터 나머지에 의해 사용될 때, 나의 인터셉터는 호출되지 않는다. 이는 / api / {모델의 기존 엔티티}와 같은 모든 URL에 적용됩니다.
Spring Data Rest URL에 대한 인터셉터가 호출되지 않는 이유는 무엇입니까? 모든 요청에 대해 인터셉터를 작동 시키려면 어떻게해야합니까?
많은 감사드립니다.
해결법
-
==============================
1.MappedInterceptor 유형의 Bean을 선언하고 HandlerInterceptorAdapter를 확장 한 인터셉터를 삽입함으로써 Spring Interceptor가 Spring Data Rest에 의해 선택되었고 이제 응용 프로그램의 모든 URL에서 작동합니다.
MappedInterceptor 유형의 Bean을 선언하고 HandlerInterceptorAdapter를 확장 한 인터셉터를 삽입함으로써 Spring Interceptor가 Spring Data Rest에 의해 선택되었고 이제 응용 프로그램의 모든 URL에서 작동합니다.
이것은 다음 구현으로 대체됩니다 (원래 질문에서이를 대체).
@Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter { @Autowired DBEditorTenantInterceptor dbEditorTenantInterceptor; @Bean public MappedInterceptor dbEditorTenantInterceptor() { return new MappedInterceptor(new String[]{"/**"}, dbEditorTenantInterceptor); } }
불행히도 Spring 설명서에서 이에 대한 참조를 찾을 수 없습니다.
-
==============================
2.@ AndrewP의 답변에 뭔가를 추가하고 싶습니다 ...
@ AndrewP의 답변에 뭔가를 추가하고 싶습니다 ...
프로젝트에서 Spring REST Data만을 사용하고 Spring Repositories와 @RepositoryRestControllers를 가로 채기를 원한다면 다음과 같은 구문으로 @Bean 메소드를 정의하면된다 :
@Bean public MappedInterceptor someMethodName() { return new MappedInterceptor( null, // => maps to any repository new YourInterceptorImpl() ); }
이러한 메소드는 모든 @Configuration 주석이있는 클래스에서 선언되어야합니다. 그리고 그러한 클래스는 특별한 것을 구현하거나 확장 할 필요가 없다. (예를 들어, WebMvcConfigurerAdapter) ... 웹상의 많은 문서는 그것을 의미하지만, 스프링 MVC 자원을 다룰 때만 적용된다고 생각한다.
인터셉터 구현은 HandlerInterceptor를 구현하거나 HandlerInterceptorAdapter를 확장해야합니다.
from https://stackoverflow.com/questions/46953039/spring-interceptor-not-working-in-spring-data-rest-urls by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] bean이 존재할 때만 주입하는 방법 (0) | 2019.07.17 |
---|---|
[SPRING] Spring 5 - 정적 자원을 제공하는 방법 (0) | 2019.07.17 |
[SPRING] 스프링 4와 함께 webSocket 서버에서 연결 이벤트를 캡처하는 방법은 무엇입니까? (0) | 2019.07.17 |
[SPRING] 3.2와 4.2 사이의 Redis Session Serializer 불일치 (0) | 2019.07.17 |
[SPRING] Spring Boot에서 MappingJackson2HttpMessageConverter를 확장하여 사용자 정의 변환기를 추가하면 기존 변환기를 덮어 쓰는 것처럼 보입니다. (0) | 2019.07.17 |