当前位置:  开发笔记 > 编程语言 > 正文

Spring MVC中的自定义HttpMessageConverter

如何解决《SpringMVC中的自定义HttpMessageConverter》经验,为你挑选了1个好方法。

实现RESTful API时,我将所有数据包装在一个对象中,使它看起来像这样.

{error: null, code: 200, data: {...actual data...}}

这导致我在任何地方使用重复的代码来包装数据:

@Transactional
@RequestMapping(value = "/", method = RequestMethod.GET)
public @ResponseBody Result> books() {

    List books = booksDao.readBooks();
    return Result.ok(books); // this gets repeated everywhere
}

所以问题是如何修改它(可能使用自定义HttpMessageConverter可能还有其他一些方法?)只返回booksDao.readBooks()并自动包装它.



1> Bart..:

就像@Ralph建议你可以使用a HandlerMethodReturnValueHandler来包装你的处理程序返回值.

实现这一目标的最简单方法是通过扩展RequestResponseBodyMethodProcessor和改变它的行为.最好的方法是创建一个自定义注释来标记处理程序方法.这将确保默认情况下您HandlerMethodReturnValueHandler将被调用而不是其他人RequestMappingHandlerAdapter.

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ResultResponseBody {}

这是一个自定义HandlerMethodReturnValueHandler命名的简单实现ResultResponseHandlerMethodProcessor,它将支持从带注释的方法返回的值ResultResponseBody.这很简单.只需覆盖supportsReturnType()handleReturnValue()方法以满足您的需要(将返回值包装到一个Result类型中).

public class ResultResponseHandlerMethodProcessor extends RequestResponseBodyMethodProcessor {
    public ResultResponseHandlerMethodProcessor(final List> messageConverters) {
        super(messageConverters);
    }

    public ResultResponseHandlerMethodProcessor(final List> messageConverters, final ContentNegotiationManager contentNegotiationManager) {
        super(messageConverters, contentNegotiationManager);
    }

    @Override
    public boolean supportsReturnType(final MethodParameter returnType) {
        return returnType.getMethodAnnotation(ResultResponseBody.class) != null;
    }

    @Override
    public void handleReturnValue(final Object returnValue, final MethodParameter returnType, final ModelAndViewContainer mavContainer, final NativeWebRequest webRequest) throws IOException, HttpMediaTypeNotAcceptableException {
        super.handleReturnValue(Result.ok(returnValue), returnType, mavContainer, webRequest);
    }
}

剩下的唯一事情是将此类添加到自定义列表中HandlerMethodReturnValueHandler并为其提供MappingJackson2HttpMessageConverter实例.

@EnableWebMvc
@Configuration
public class ApplicationConfiguration extends WebMvcConfigurerAdapter
    @Override
    public void addReturnValueHandlers(final List returnValueHandlers) {
        List> messageConverters = new ArrayList<>();
        messageConverters.add(new MappingJackson2HttpMessageConverter());
        returnValueHandlers.add(new ResultResponseHandlerMethodProcessor(messageConverters));
    }
}

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有