首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在spring-hateos项目中使用

如何在spring-hateos项目中使用
EN

Stack Overflow用户
提问于 2017-12-06 00:26:43
回答 1查看 85关注 0票数 2

当使用spring-data-rest时,会对从控制器返回的Resource类进行后处理(例如RepositoryRestControllers)。在后处理中调用适当的ResourceProcessor

负责此操作的类是spring-hateoas的一部分ResourceProcessorHandlerMethodReturnValueHandler

我现在有一个只使用spring-hateoas的项目,我想知道在这种情况下如何配置ResourceProcessorHandlerMethodReturnValueHandler。看起来它的自动配置部分仍然驻留在spring-data-rest中。

关于如何在spring-hateoas上下文中启用ResourceProcessorHandlerMethodReturnValueHandler,有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2018-06-21 11:51:05

我最近也一直在关注这一点,关于如何实现这一点的文档并不存在。如果创建ResourceProcessorInvokingHandlerAdapter类型的RequestMappingHandlerAdapter,似乎会丢失自动配置的bean及其所有特性。因此,我希望避免使用这个bean或丢失WebMvcAutoConfiguration,因为我真正想要的只是ResourceProcessorHandlerMethodReturnValueHandler

您不能只通过WebMvcConfigurer.addReturnValueHandlers添加一个ResourceProcessorHandlerMethodReturnValueHandler,因为我们需要做的实际上是覆盖整个列表,就像在ResourceProcessorInvokingHandlerAdapter.afterPropertiesSet中发生的那样

代码语言:javascript
复制
@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上的处理程序列表的设置

代码语言:javascript
复制
@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;
    }
}

到目前为止,这似乎是可行的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47658272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档