spring本身提供了参数校验的功能,也就是在初始化一个对象的时候,对其进行值校验。spring通过在属性上添加注解的方式来提供校验的功能。这里的注解其实也是通过反射机制来实现。
这里说明一下spring的校验注解有:
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
注解的用法:
直接在类的属性上添加相应的注解即可。
@ApiModel
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class UserManageAddRequest {
@ApiModelProperty(name="userName",value="用户名称")
@NotBlank(message="不能为空")
private String username;
@ApiModelProperty(name="loginid",value="手机号")
@NotBlank(message="不能为空")
@Pattern(regexp = "^\\d{11}$", message = "手机号码格式错误")
private String loginid;
@ApiModelProperty(name="userpassword",value="用户密码")
@NotBlank(message="不能为空")
private String userpassword;
@ApiModelProperty(name="useremil",value="邮箱")
@NotBlank(message="不能为空")
private String useremil;
@ApiModelProperty(name="roid",value="权限")
@NotNull(message="不能为空")
private Integer roid;
}
校验的如果发生作用:
要让我么的注解起到作用,需要在接收值得地方开启值校验的机制,这里使用@Vaild注解
/**
* 添加用户
* @param user 用户
* @throws Exception
*/
@PostMapping(value="/user-add",consumes="application/json",produces = "application/json;charset=utf-8")
@ApiOperation(value="创建用户",notes="创建用户")
public void userAdd(@Valid @RequestBody UserManageAddRequest user) throws Exception{
UserDto dto=ModelMapUtils.map(user, UserDto.class);
userManageServiceImp.createUser(dto);
}
但是注解校验的报错是将报错的详细进行抛出,显然不是我们需要的,所以呐,我们需要进行进行统一的报错处理,这样前端也好处理。
Validation failed for argument [0] in public void com.inclination.scaffold.api.interfaces.UserManageApi.userAdd(com.inclination.scaffold.api.request.user.UserManageAddRequest) throws java.lang.Exception: [Field error in object 'userManageAddRequest' on field 'loginid': rejected value [string]; codes [Pattern.userManageAddRequest.loginid,Pattern.loginid,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userManageAddRequest.loginid,loginid]; arguments []; default message [loginid],[Ljavax.validation.constraints.Pattern$Flag;@133973b5,org.springframework.validation.beanvalidation.SpringValidatorAdapter$ResolvableAttribute@73a3d479]; default message [手机号码格式错误]]
我们期望的报错是这样的:
但是我们知道这里注解报错的Exception为:MethodArgumentNotValidException 所以我么在@ControllerAdvice这里捕获这个异常,然后进行处理然后进行统一报错处理。详细代码如下:
@ResponseBody
@ExceptionHandler(MethodArgumentNotValidException.class)
public Error exceptionHander(HttpServletRequest req, MethodArgumentNotValidException e){
List<ObjectError> errorList=e.getBindingResult().getAllErrors();
String error="";
for (ObjectError objectError : errorList) {
error=objectError.getDefaultMessage();
}
Error ew=new Error("0001",error);
return ew;
}
这里的Error为
public class Error {
private String code;
private String msg;
public Error(String code2, String message) {
// TODO Auto-generated constructor stub
this.code=code2;
this.msg=message;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}