【问题标题】:Strict Json Enforcing when using @RequestBody使用 @RequestBody 时严格执行 Json
【发布时间】:2015-10-28 14:46:34
【问题描述】:

我在使用 @RequestBody MyObject 时注意到,如果您没有在 json 中指定所有参数,那么无论如何它们都会被赋予默认值。

public class MyObject {

    @JsonCreator
    public MyObject (@JsonProperty("a") long a,
                     @JsonProperty("b") double b,
                     @JsonProperty("c") String c,

}

所以一个json请求如下:

{
 "a" : 0
}

反序列化后将产生以下内容

c == null, b == 0.0, a = 0

controller方法,其中json被requestbody反序列化如下:

@RequestMapping(value = {"/doSomething/"}, method = RequestMethod.POST)
@ResponseBody void something(@RequestBody MyObject myObject) {
    //  Logic here. 
}

在将 json 解析为对象时,我是否可以强制 requestbody 确保所有参数都存在?

编辑:

因此,例如一个字符串将被赋予一个空值,而一个双精度将被赋予一个值 0.0。

从我所阅读的内容来看,这是我正在使用的杰克逊库所期望的。目标是了解何时将 json 反序列化为对象是否缺少 json 属性,而不是让它们自动赋予默认值。

【问题讨论】:

  • 请举例说明您注意到的
  • 我已经更新了问题。我似乎在 SO 上有一个问题,我的大部分问题都没有得到解答,所以任何关于命名/措辞/解释的建设性建议都将不胜感激。
  • 您想如何知道是否有缺少成员?通过异常?
  • 异常会起作用。我只需要知道 json 何时无效,以便我可以停止继续。

标签: java json spring rest jackson


【解决方案1】:

我通过使用 @valid 注释对对象进行一些验证来解决这个问题。 (javax.validation.Valid)

控制器现在在 requestbody 旁边有一个 @Valid 注释和一个 bindingresult 对象,它允许我检查绑定是否成功。

@RequestMapping(value = {"/doSomething/"}, method = RequestMethod.POST)
@ResponseBody void something(@Valid @RequestBody MyObject myObject, BindingResult bindingResult) {

    if (bindingResult.hasErrors()) {
        return bindingResult.toString();
    }

}

我的对象现在如下所示:

public class MyObject {
    @NotNull private Long a;
    @NotNull private Double b;
    @NotNull private String c;

   // And so on... 

}

将原始类型切换为对象意味着如果 json 中缺少这些值,那么它们将被尝试给出无效的 null 值来解决我的问题。

更多信息在这里:https://dzone.com/articles/spring-31-valid-requestbody

【讨论】:

    猜你喜欢
    • 2012-02-14
    • 2019-09-26
    • 2014-12-14
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    相关资源
    最近更新 更多