我正在尝试验证JSON(由客户端作为请求正文传递(,然后再将其转换为控制器方法中的模型。
如果验证通过,则不返回任何内容,让该过程继续原样(Spring boot 将 JSON 转换为标记为 @RequestBody 的模型(。在验证失败的情况下抛出错误(everit-org/json-schema(。
我尝试了两种方式:
-
实现
HandlerMethodArgumentResolver
,但resolveArgument()
没有提供请求正文详细信息,因为它已经读取并存储在ContentCachingRequestWrapper
中。注意:
ContentCachingRequestWrapper
中的inputStream
没有任何请求正文详细信息。 -
使用弹簧
Interceptor
.但这并不能帮助我找到请求中传递的请求正文类型。因为每个请求的 JSON 架构都不同。
我可以尝试其他方法吗?
我无法添加评论...所以。。。
您需要什么样的验证?如果您只想验证字符串长度或数字范围等字段。我建议您在控制器 mehtod 参数和型号上使用@Validated
:
@NotNull
@Size(min = 32, max = 32)
private String id;
控制器:
@PatchMapping
public Object update(@RequestBody @Validated User user, Errors errors) {
...
}
如果有什么问题,errors.hasErrors()
会返回true
.
编辑:
好的,我在过滤器中做了一些测试:
HttpServletRequest httpServletRequest = (HttpServletRequest)request;
ServletInputStream inputStream = httpServletRequest.getInputStream();
byte[] a = new byte[1024];
inputStream.read(a);
System.out.println(IOUtils.toString(a));
我得到了一个 json 字符串(一段请求正文(:
{"template":"5AF78355A4F0D58E03CE9F55AFA850F8","bd":"" ...