gpt4 book ai didi

java - 在自定义注解中实现@RequestBody的功能

转载 作者:太空宇宙 更新时间:2023-11-04 13:28:59 26 4
gpt4 key购买 nike

我创建了一个自定义注释@JsonSchema,在其中实现了@RequestBody 的功能。我的注释将始终用于从 Web 请求中读取 JSON。但我想在进一步传递 JSON 之前先根据模式验证它。为此,我有一个实现 HandlerMethodArgumentResolver

的类

最初,我的注释仅与 String 一起使用,因此我很容易从 RequestResponseBodyMethodProcessor#resolveArgument 获取通用对象,将其转换为字符串,验证它,然后返回它。但现在我也想将我的注释与自定义类一起使用。

所以我想了解的是 @RequestBody 如何将 Web 请求正文中的 JSON 绑定(bind)到兼容的类。如果我了解这是如何发生的,我可以首先将主体提取为字符串,进行验证,然后将主体绑定(bind)到具有注释的任何类并返回它。

我当前的 resolveArgument 实现

@Override
public Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {
Object value = getRequestResponseBodyMethodProcessor()
.resolveArgument(parameter, mavContainer, webRequest, binderFactory);
return value;
// return validateJson(value, parameter); I need to pass a String here

}

// Using message converters to read from body of web request. Can I parse the message earlier than it is cast to the required object type?
private RequestResponseBodyMethodProcessor getRequestResponseBodyMethodProcessor() {

if (requestResponseBodyMethodProcessor == null) {
List<HttpMessageConverter<?>> messageConverters = requestMappingHandlerAdapter().getMessageConverters();
requestResponseBodyMethodProcessor = new RequestResponseBodyMethodProcessor(messageConverters);
}
return requestResponseBodyMethodProcessor;
}

最佳答案

经过一番研究,我发现了一个名为 HttpMessageConverter 的东西。消息转换器用于通过 HTTP 将 Java 对象与 JSON、XML 等进行编码和解码。有一些默认转换器,StringHttpMessageConverter 就是其中之一。我们还可以添加自己的消息转换器。 Here这是一篇很好的文章,解释了如何做到这一点。

我通过调用 RequestMappingHandlerAdapter#getMessageConverters 获取了默认的消息转换器集合。我从中提取了 StringHTTPMEssageConverter 并调用其 read 方法将正文读取为字符串。

这是代码:

if (requestResponseBodyMethodProcessor == null) {
List<HttpMessageConverter<?>> messageConverters = requestMappingHandlerAdapter().getMessageConverters();
requestResponseBodyMethodProcessor = new RequestResponseBodyMethodProcessor(messageConverters);
}

String body = null;
StringHttpMessageConverter stringHttpMessageConverter = null;
HttpServletRequest servletRequest = webRequest.getNativeRequest(HttpServletRequest.class);
HttpInputMessage inputMessage = new ServletServerHttpRequest(servletRequest);
if (messageConverters.get(1) instanceof StringHttpMessageConverter)
stringHttpMessageConverter = (StringHttpMessageConverter) messageConverters.get(1);

try {
body = stringHttpMessageConverter.read(String.class, inputMessage);
} catch (IOException e) {
e.printStackTrace();
}

关于java - 在自定义注解中实现@RequestBody的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32372199/

26 4 0
文章推荐: Java 在执行 Activity 中的代码之前等待线程(在另一个类中)完成
文章推荐: html - 将
文章推荐: css - IE 8 不获取 CSS
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com