Spring Data Rest:ResourceProcessor配置无法正常工作

时间:2016-07-25 14:45:40

标签: spring spring-data-rest spring-hateoas

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

我正在尝试注册@Bean ResourceProcessor<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;
    }

}

完全忽略处理器:永远不会打印消息。

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

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

    //...
}

这个构造函数在应用程序开始时被调用2次而不是只有一次(正如我所料),我不明白为什么。

第一次,“处理器”变量用两个bean(按预期)和bean org.springframework.data.rest.webmvc.ProfileResourceProcessor解决。

但第二次,“processor”变量只用bean org.springframework.data.rest.webmvc.ProfileResourceProcessor来解决。

第二个配置@Override第一个配置。

有什么想法吗?

1 个答案:

答案 0 :(得分: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在第一次加载了正确的配置; &#34; load-on-startup&#34; servlet的属性&#34; RepositoryRestDispatcherServlet&#34;启动第二个上下文配置加载。

我还有一个扩展org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration的自定义类,但是当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());
    }

}

该类与RepositoryRestDispatcherServlet相同,唯一的区别是在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>

通过这种方式,配置被正确加载和保留。