【问题标题】:Implement functionality of @RequestBody in custom annotation在自定义注解中实现@RequestBody 的功能
【发布时间】:2015-09-03 09:44:18
【问题描述】:

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

的类

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

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

我目前对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;
}

【问题讨论】:

    标签: java json spring spring-mvc annotations


    【解决方案1】:

    经过一番研究,我发现了一个名为 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();
    }
    

    【讨论】:

      猜你喜欢
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      相关资源
      最近更新 更多