2016-07-25 74 views
0

我對Spring Data Rest實現(版本2.5.2.RELEASE)有奇怪的行爲。Spring Data Rest:ResourceProcessor配置不能正常工作

我正在嘗試註冊@BeanResourceProcessor<Resource<Entity>>,但有些奇怪。

1)在一個類中聲明的@Bean

@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

@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; 
    } 

} 

我有兩種解決方案嘗試

處理器ar完全忽略:郵件從不打印。

我注意到類org.springframework.data.rest.webmvc.ResourceProcessorInvoker有一個構造函數:

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

    //... 
} 

此構造是在應用程序,而不是僅一次的開始調用2次(我會期待),和我不明白爲什麼。

第一次,「處理器」變量用兩個bean(如預期的)和bean org.springframework.data.rest.webmvc.ProfileResourceProcessor解決。

但第二次,「處理器」變量只解決了豆org.springframework.data.rest.webmvc.ProfileResourceProcessor

第二個配置@Override第一個。

有什麼想法?

回答

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裝在第一時間正確的配置; servlet「​​」的「load-on-startup」屬性啓動第二個上下文配置加載。

我也有這樣的擴展org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration自定義類,但這種自定義類是由​​負載的默認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()); 
    } 

} 

類是一樣的​​,與在setContextConfigLocation傳遞擴展的自定義類的唯一區別RepositoryRestMvcConfiguration(在本例中爲RepositoryBaseConfiguration)。

很顯然,我不得不更新web.xml如下:

<servlet> 
    <servlet-name>rest</servlet-name> 
    <servlet-class>my.package.AppRepositoryRestDispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

通過這種方式,配置是否正確裝入和編程和維持。