2016-07-25 2 views
0

스프링 데이터 나머지 구현 (버전 2.5.2.RELEASE)에서 이상한 동작이 있습니다.스프링 데이터 나머지 : ResourceProcessor 구성이 제대로 작동하지 않습니다.

@BeanResourceProcessor<Resource<Entity>>으로 등록하려고하는데 이상한 점이 있습니다. 클래스에 @Bean 선언

1) :

@Component 
public class AuthorResourceProcessor implements ResourceProcessor<Resource<Author>> { 

    @Override 
    public Resource<Author> process(Resource<Author> resource) { 
     System.out.println("method process of class AuthorResourceProcessor"); 
     return resource; 
    } 

} 
:

@Bean 
public ResourceProcessor<Resource<Author>> authorProcessor() { 

    return new ResourceProcessor<Resource<Author>>() { 

     @Override 
     public Resource<Author> process(Resource<Author> resource) { 

      System.out.println("method process of bean ResourceProcessor of class RepositoryBaseConfiguration"); 
      return resource; 
     } 
    }; 
} 

2) 인터페이스 ResourceProcessor 구현

나는 두 솔루션의 종류하려고 해요

프로세서 ar e는 완전히 무시됩니다. 메시지는 절대로 인쇄되지 않습니다.

나는 클래스 org.springframework.data.rest.webmvc.ResourceProcessorInvoker 생성자가 나타났습니다 : (내가 기대로)이 생성자 대신 한 번만의 응용 프로그램의 시작 부분에 2 회를 호출

public ResourceProcessorInvoker(Collection<ResourceProcessor<?>> processors) { 

    //... 
} 

을, 그리고 이유를 이해하지 못한다.

처음으로 "프로세서"변수는 두 개의 bean (예상대로)과 bean org.springframework.data.rest.webmvc.ProfileResourceProcessor으로 해결됩니다.

두 번째로, "프로세서"변수는 콩 org.springframework.data.rest.webmvc.ProfileResourceProcessor만으로 해결됩니다.

두 번째 구성 @은 첫 번째 구성을 오버라이드합니다.

아이디어가 있으십니까?

답변

0

문제는 응용 프로그램 시작시로드되는 구성에 따라 다릅니다.

은 내가 web.xml에이 구성했다 :

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/spring/spring-web-config.xml</param-value> 
</context-param> 

<servlet> 
    <servlet-name>rest</servlet-name> 
    <servlet-class>org.springframework.data.rest.webmvc.RepositoryRestDispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

는 그래서, ContextLoaderListener 처음에 정확한 구성을로드를; 서블릿 "RepositoryRestDispatcherServlet"의 "load-on-startup"속성은 두 번째 컨텍스트 구성로드를 시작합니다.

는 또한 org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration을 확장 사용자 정의 클래스를했지만,이 사용자 정의 클래스는 RepositoryRestDispatcherServlet부하 기본RepositoryRestMvcConfiguration, 의 생성자가 구성의 손실의 원인이 순간에 의해 무시되었습니다.

public class AppRepositoryRestDispatcherServlet extends DispatcherServlet { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    public AppRepositoryRestDispatcherServlet() { 
     configure(); 
    } 

    public AppRepositoryRestDispatcherServlet(WebApplicationContext webApplicationContext) { 
     super(webApplicationContext); 
     configure(); 
    } 

    private void configure() { 
     setContextClass(AnnotationConfigWebApplicationContext.class); 
     setContextConfigLocation(RepositoryBaseConfiguration.class.getName()); 
    } 

} 

클래스는 RepositoryRestDispatcherServlet과 동일의 setContextConfigLocation으로 연장 사용자 정의 클래스를 전달하는 유일한 차이 :

내가이 방법으로 사용자 정의 RepositoryRestDispatcherServlet을 만든 그 문제를 해결하기 위해 RepositoryRestMvcConfiguration (이 예에서는 RepositoryBaseConfiguration)입니다.

이런 식으로
<servlet> 
    <servlet-name>rest</servlet-name> 
    <servlet-class>my.package.AppRepositoryRestDispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

는 구성이 제대로로드 프로그램와 유지되어 다음과 같이

은 분명히 나는 ​​ web.xml를 업데이트했다.