Spring 数据休息:ResourceProcessor 配置工作不正常
Spring Data Rest: ResourceProcessor configuration is not working properly
我对 Spring Data Rest 实现(版本 2.5.2.RELEASE)有一个奇怪的行为。
我正在尝试注册一个 @Bean
的 ResourceProcessor<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>
这样就正确加载和维护了配置。
我对 Spring Data Rest 实现(版本 2.5.2.RELEASE)有一个奇怪的行为。
我正在尝试注册一个 @Bean
的 ResourceProcessor<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>
这样就正确加载和维护了配置。