gpt4 book ai didi

java - Spring MVC 中的自定义 HttpMessageConverter

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:04:53 25 4
gpt4 key购买 nike

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

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

这导致我到处使用重复代码来包装数据:

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

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

所以问题是我如何修改它(也许使用自定义 HttpMessageConverter 或其他一些方法?)以仅返回 booksDao.readBooks() 并自动包装它。

最佳答案

就像@Ralph 建议的那样,您可以使用HandlerMethodReturnValueHandler 来包装您的处理程序返回值。

实现此目的的最简单方法是扩展 RequestResponseBodyMethodProcessor 并稍微改变其行为。最好是创建一个自定义注释来标记您的处理程序方法。这将确保您的 HandlerMethodReturnValueHandler 将被调用,而不是默认情况下 RequestMappingHandlerAdapter 包含的其他内容。

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

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

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

public ResultResponseHandlerMethodProcessor(final List<HttpMessageConverter<?>> 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<HandlerMethodReturnValueHandler> returnValueHandlers) {
List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
messageConverters.add(new MappingJackson2HttpMessageConverter());
returnValueHandlers.add(new ResultResponseHandlerMethodProcessor(messageConverters));
}
}

关于java - Spring MVC 中的自定义 HttpMessageConverter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22890952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com