我对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第一个配置。
有什么想法吗?
答案 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>
通过这种方式,配置被正确加载和保留。