2016-07-25 77 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> 

通过这种方式,配置是否正确装入和编程和维持。