Spring 数据休息:ResourceProcessor 配置工作不正常

Spring Data Rest: ResourceProcessor configuration is not working properly

我对 Spring Data Rest 实现(版本 2.5.2.RELEASE)有一个奇怪的行为。

我正在尝试注册一个 @BeanResourceProcessor<Resource<Entity>>,但是有些奇怪。

我正在尝试两种解决方案:

1) 在 class:

中声明 @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;
    }

}

处理器被完全忽略:从不打印消息。

我注意到 class org.springframework.data.rest.webmvc.ResourceProcessorInvoker 有一个构造函数:

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

    //...
}

此构造函数在应用程序启动时被调用 2 次,而不是仅调用一次(如我所料),我不明白为什么。

第一次,"processors" 变量用两个 bean(如预期的那样)和 bean org.springframework.data.rest.webmvc.ProfileResourceProcessor.

求解

但是第二次,"processors"变量只用beanorg.springframework.data.rest.webmvc.ProfileResourceProcessor.

解决了

第二个配置@覆盖第一个

有什么想法吗?

问题取决于应用程序启动时加载的配置。

我在 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“RepositoryRestDispatcherServlet”的“load-on-startup”属性启动第二个上下文配置加载。

我也有一个扩展org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration的自定义class,但是这个自定义class被RepositoryRestDispatcherServlet的构造函数忽略了加载默认 RepositoryRestMvcConfiguration, 导致配置丢失.

为了解决这个问题,我以这种方式创建了一个 自定义 RepositoryRestDispatcherServlet

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());
    }

}

class 与 RepositoryRestDispatcherServlet 相同,唯一的区别是在 setContextConfigLocation 中传递了扩展 RepositoryRestMvcConfiguration 的自定义 class(RepositoryBaseConfiguration 在这个例子中)。

显然我必须按如下方式更新 web.xml

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

这样就正确加载和维护了配置。