【问题标题】:Spring's Bindingresult for json Body Containing Nested different kind of Objects包含嵌套不同类型对象的 json 主体的 Spring Bindingresult
【发布时间】:2018-09-10 21:29:07
【问题描述】:

我有一个场景,其中 json 请求由不同的自定义对象组成,例如:

{
 "person:":{
    "name":"xyx",
    "age":25
  },
  "movieList":[
     {
       "name":"yyy",
       "duration":34,
       "language":"english"
     },
     {
       "name":"zzz",
       "duration":37,
       "language":"english"
     }
   ]

}

java 类看起来像

public class Customer{
 private Person person,
 private List<MovieList> movieList;
}

验证条件:字段不能为空

现在来到 spring 控制器,我想验证来自请求的每个对象,并且我能够验证整个 Customer 对象,因为 BindingResult 应用于整个请求 Body。但我的要求是验证 Person 对象和 MovieList 对象分开。

public void createCustomer(@RequestBody Customer customer,BindingResult result){
}

而且我的要求是抛出导致异常发生的特定对象的异常,因为我的框架就是这样设计的。

【问题讨论】:

  • PersonMovieList的定义是什么?
  • 类 MovieList{ NotNull 字符串名称; NotNull 持续时间长; NotNull 字符串语言; } 类人{ NotNull 字符串名称; NotNull int 年龄; }
  • 您肯定会编写一些自定义验证
  • @tonyhoan 它与验证无关。

标签: java json spring bean-validation hibernate-validator


【解决方案1】:

您可以使用 spring 框架中的验证注释。它将验证 POJO 中的每个字段。请检查以下示例。在 MovieList 中使用相同的方法。

import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.validation.constraints.Email;

public class Person{

@NotNull(message = "Name cannot be null")
private String name;

@AssertTrue
private boolean working;

@Size(min = 10, max = 200, message = "About Me must be between 10 and 200 characters")
private String aboutMe;

@Min(value = 18, message = "Age should not be less than 18")
@Max(value = 150, message = "Age should not be greater than 150")
private int age;

@Email(message = "Email should be valid")
private String email;

// standard setters and getters 
 }

【讨论】:

  • 谢谢,但我正在尝试验证 Customer 类是一个整体而不是特定对象,并且绑定结果被标记为整个请求正文,而不是 Customer 内的嵌套对象。
【解决方案2】:

首先,写下PersonMovieList 的验证代码(自定义验证或基于注释)。 正如您所说,您想分别验证 PersonMovieList 对象,您可以编写它们的验证器,然后进行手动验证:-

validator.validate(person, bindingResult);  
if (bindingResult.hasErrors()) {  
    //throw your exception for person object  
}

validator.validate(movieList, bindingResult);  
if (bindingResult.hasErrors()) {  
    //throw your exception for movieList object  
}//Or iterate through each object

要抛出异常,您可以根据它是字段错误还是 ObjectError 来抛出异常。

for (Object object : bindingResult.getAllErrors()) {
    if(object instanceof FieldError) {
        FieldError fieldError = (FieldError) object;
        //throw error
    }

    if(object instanceof ObjectError) {
        ObjectError objectError = (ObjectError) object;
        //throw error
    }
}

希望对你有帮助!

【讨论】:

  • 谢谢,但我的问题是我的请求正文是客户,而 bindingResult 是针对对 Person+MovieList 疯狂的整个客户。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-10
  • 2012-02-20
相关资源
最近更新 更多