我在使用@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属性而不是让它们自动赋予默认值。
答案 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