当使用spring-data-rest时,会对从控制器返回的Resource类进行后处理(例如RepositoryRestControllers)。在后处理中调用适当的ResourceProcessor。
负责此操作的类是spring-hateoas的一部分ResourceProcessorHandlerMethodReturnValueHandler。
我现在有一个只使用spring-hateoas的项目,我想知道在这种情况下如何配置ResourceProcessorHandlerMethodReturnValueHandler。看起来它的自动配置部分仍然驻留在spring-data-rest中。
关于如何在spring-hateoas上下文中启用ResourceProcessorHandlerMethodReturnValueHandler,有什么建议吗?
发布于 2018-06-21 11:51:05
我最近也一直在关注这一点,关于如何实现这一点的文档并不存在。如果创建ResourceProcessorInvokingHandlerAdapter类型的RequestMappingHandlerAdapter,似乎会丢失自动配置的bean及其所有特性。因此,我希望避免使用这个bean或丢失WebMvcAutoConfiguration,因为我真正想要的只是ResourceProcessorHandlerMethodReturnValueHandler。
您不能只通过WebMvcConfigurer.addReturnValueHandlers添加一个ResourceProcessorHandlerMethodReturnValueHandler,因为我们需要做的实际上是覆盖整个列表,就像在ResourceProcessorInvokingHandlerAdapter.afterPropertiesSet中发生的那样
@Override
public void afterPropertiesSet() {
super.afterPropertiesSet();
// Retrieve actual handlers to use as delegate
HandlerMethodReturnValueHandlerComposite oldHandlers = getReturnValueHandlersComposite();
// Set up ResourceProcessingHandlerMethodResolver to delegate to originally configured ones
List<HandlerMethodReturnValueHandler> newHandlers = new ArrayList<HandlerMethodReturnValueHandler>();
newHandlers.add(new ResourceProcessorHandlerMethodReturnValueHandler(oldHandlers, invoker));
// Configure the new handler to be used
this.setReturnValueHandlers(newHandlers);
}因此,在没有更好的解决方案的情况下,我添加了一个BeanPostProcessor来处理现有RequestMappingHandlerAdapter上的处理程序列表的设置
@Component
@RequiredArgsConstructor
@ConditionalOnBean(ResourceProcessor.class)
public class ResourceProcessorHandlerMethodReturnValueHandlerConfigurer implements BeanPostProcessor {
private final Collection<ResourceProcessor<?>> resourceProcessors;
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
if (bean instanceof RequestMappingHandlerAdapter) {
RequestMappingHandlerAdapter requestMappingHandlerAdapter = (RequestMappingHandlerAdapter) bean;
List<HandlerMethodReturnValueHandler> handlers =
requestMappingHandlerAdapter.getReturnValueHandlers();
HandlerMethodReturnValueHandlerComposite delegate =
handlers instanceof HandlerMethodReturnValueHandlerComposite ?
(HandlerMethodReturnValueHandlerComposite) handlers :
new HandlerMethodReturnValueHandlerComposite().addHandlers(handlers);
requestMappingHandlerAdapter.setReturnValueHandlers(Arrays.asList(
new ResourceProcessorHandlerMethodReturnValueHandler(delegate,
new ResourceProcessorInvoker(resourceProcessors))));
return requestMappingHandlerAdapter;
}
else return bean;
}
}到目前为止,这似乎是可行的。
https://stackoverflow.com/questions/47658272
复制相似问题