下面是关于使用BindingResult自定义错误信息的完整攻略。
一、BindingResult简介
在Spring MVC框架中,接受前端数据的方法一般会使用@ModelAttribute或@RequestBody注解对参数进行声明,此时也可以添加BindingResult类型的参数,用于接收数据绑定时产生的错误信息。
BindingResult是Spring MVC框架中一个关于数据绑定的验证结果类。它和Errors一样,都是在数据绑定的过程中出现错误时保存错误信息的。BindingResult承载的是与Model相关的数据验证结果,而Errors是完全与验证结果无关的。
二、使用BindingResult自定义错误信息
2.1 错误信息的定义
在使用BindingResult自定义错误信息时,我们需要定义一个ErrorInfo类,来存储错误信息的字段和对应的错误代码。例如:
public class ErrorInfo {
private String field;
private String message;
private String code;
// getter和setter方法
}
在这个ErrorInfo类中,我们定义了三个字段:field代表错误字段,message代表错误信息,code代表错误代码。
2.2 核心代码
在使用BindingResult自定义错误信息时,主要需要对BindingResult进行判断和处理。例如我们收到了一个name字段,需要检查它是否为空。
@PostMapping("/demo")
@ResponseBody
public ErrorInfo demo(@RequestBody @Validated DemoEntity demo, BindingResult bindingResult) {
ErrorInfo errorInfo = new ErrorInfo();
if (bindingResult.hasErrors()) {
// 打印错误信息
List<ObjectError> errors = bindingResult.getAllErrors();
String error = errors.stream().map(ObjectError::getDefaultMessage).collect(Collectors.joining(","));
log.error(error);
errorInfo.setCode("200002");
errorInfo.setMessage(error);
return errorInfo;
}
return null;
}
在这段代码中,我们使用了@RequestBody注解来接收前端的数据,在数据绑定的过程中,会自动根据实体类的信息进行数据类型转换。
使用@Validated注解开启数据的验证功能,如果数据验证出现错误,则会通过BindingResult对象保存相关信息。我们在方法中,通过判断BindingResult对象中是否存在错误来决定如何进行下一步操作。
如果存在错误,我们首先将错误信息在后台进行打印,然后根据自定义的错误码和错误信息实例化一个ErrorInfo对象并返回给前端。
如果数据验证通过,则直接返回null或者其他需要的结果即可。
2.3 示例说明
下面通过两个示例来详细说明如何使用BindingResult自定义错误信息。
2.3.1 示例一
在这个示例中,我们定义了一个User实体类用于接收前端传递过来的User信息。在User实体类中,我们使用了@NotNull注解来要求name字段值不为空,如果为空,则认为这是一个错误的请求。
public class User {
@NotNull(message = "姓名不能为空")
private String name;
private Integer age;
private String gender;
// getter和setter方法
}
在我们编写控制器代码时,我们需要使用BindingResult对象来获取前端返回的错误信息。如果存在错误信息,则实例化ErrorInfo并设置相关信息,然后返回给前端即可。
@PostMapping("/add")
@ResponseBody
public ErrorInfo addUser(@RequestBody @Validated User user, BindingResult bindingResult) {
ErrorInfo errorInfo = new ErrorInfo();
if (bindingResult.hasErrors()) {
List<ObjectError> errors = bindingResult.getAllErrors();
String errorMsg = errors.stream().map(x -> x.getDefaultMessage()).collect(Collectors.joining(", "));
errorInfo.setCode("1002");
errorInfo.setMessage(errorMsg);
errorInfo.setField("name");
}
return errorInfo;
}
在这个示例中,我们需要注意以下几点:
-
@Validated注解用于开启数据验证功能,可以直接在实体类上使用(例如示例中的User类)。
-
BindingResult与@Validated注解必须一起使用,否则无法获得验证结果。
-
如果前端请求中name字段为空,则会进入到if语句中,进行相关错误信息存储和返回处理。
2.3.2 示例二
在这个示例中,我们定义了一个Student实体类,用于接收前端传递过来的学生的信息。我们对于该实体类中各字段都添加了相应的验证注解,通过这种方式进行数据校验。
public class Student {
private int id;
@NotEmpty(message = "姓名不能为空")
private String name;
@Range(min = 10, max = 99, message = "年龄必须在{min}到{max}之间")
private int age;
@NotBlank(message = "性别不能为空")
private String gender;
// getter和setter方法
}
在控制器代码中,我们通过@Validated注解和BindingResult对象来进行参数验证和错误信息的获取。
@RequestMapping("/register")
@ResponseBody
public ErrorInfo register(@RequestBody @Validated Student student, BindingResult bindingResult) {
ErrorInfo errorInfo = new ErrorInfo();
if (bindingResult.hasErrors()) {
List<ObjectError> errors = bindingResult.getAllErrors();
String errorMsg = errors.stream().map(x -> x.getDefaultMessage()).collect(Collectors.joining(", "));
errorInfo.setCode("1002");
errorInfo.setMessage(errorMsg);
}
return errorInfo;
}
在这个示例中,我们需要注意以下几点:
-
在实体类中使用@NotEmpty、@Range、@NotBlank等验证注解。
-
在控制器方法中,使用@Validated注解和BindingResult对象来获取验证信息。
-
对于前端请求中传递的信息,进行相应的校验,生成相关的错误信息和错误码,并返回给前端即可。
以上就是关于使用BindingResult自定义错误信息的完整攻略,希望可以对您有所帮助!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用BindingResult 自定义错误信息 - Python技术站