복붙노트

[SPRING] Spring 데이터 수신 REST URL에서 작동하지 않는 Spring 인터셉터

SPRING

Spring 데이터 수신 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. ==============================

    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. ==============================

    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를 확장해야합니다.

  3. from https://stackoverflow.com/questions/46953039/spring-interceptor-not-working-in-spring-data-rest-urls by cc-by-sa and MIT license