【问题标题】:Get request body as string/json to validate with a json schema- Spring boot REST API将请求正文作为字符串/json 以使用 json 模式进行验证-Spring boot REST API
【发布时间】:2018-10-14 05:59:49
【问题描述】:

我正在尝试验证 JSON(由客户端作为请求正文传递),然后再将其转换为 Controller 方法中的模型。

如果验证通过则不返回任何内容,让流程照原样继续(spring boot 将 JSON 转换为标记为 @RequestBody 的模型)。验证失败时抛出错误 (everit-org/json-schema)。

我尝试了两种方式:

  1. 实现HandlerMethodArgumentResolver,但resolveArgument() 不提供请求正文详细信息,因为它已被读取并存储在ContentCachingRequestWrapper 中。

    注意:ContentCachingRequestWrapper 中的 inputStream 没有任何请求正文详细信息。

  2. 使用springInterceptor。但这并不能帮助我找到请求中传递的请求正文类型。由于每个请求的 JSON 架构都不同。

我可以尝试其他任何方法吗?

【问题讨论】:

    标签: spring-boot httprequest json-schema-validator


    【解决方案1】:

    我无法添加评论...所以...

    您需要什么样的验证?如果您只想验证字符串长度或数字范围等字段。我建议您在控制器方法参数和模型上使用@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":"" ...
    

    【讨论】:

    • 我有 JSON 模式。想针对它验证请求 JSON。不需要@Validate 方法..谢谢..
    • 是的。有一些使用过滤器的建议。我记得很模糊,不确定我是否尝试过。如果过滤器适合您,请更新。
    • 如果你能在 GitHub 上分享一个工作示例项目,那就太好了。我可以看到许多其他人正在寻求解决方案。
    • ...这是公司的项目,与这些代码相关的东西不多...
    猜你喜欢
    • 2020-03-14
    • 1970-01-01
    • 2020-07-29
    • 2016-04-23
    • 2023-04-04
    • 1970-01-01
    • 2020-10-18
    • 2020-10-11
    • 2020-08-21
    相关资源
    最近更新 更多