使用@RequestBody时严格Json强制执行

时间:2015-10-28 14:46:35

标签: java json spring rest jackson

我在使用@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

请求体对json进行反序列化的控制器方法如下:

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

在将json解析为对象时,我是否可以强制执行请求主体以确保所有参数都存在?

编辑:

因此,例如,字符串将被赋予空值,而double将被赋予值0.0。

从我所读过的内容中可以看出我正在使用的jackson库。目标是知道何时将json反序列化为对象是否缺少json属性而不是让它们自动赋予默认值。

1 个答案:

答案 0 :(得分:0)

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

控制器现在在请求体旁边有一个@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中缺少这些值,则会尝试给出无效的空值来解决我的问题。

此处提供更多信息:https://dzone.com/articles/spring-31-valid-requestbody