在进入Controller前完成参数的校验,针对对象参数
分为两个验证方式
(1)直接使用已定义的校验方式
1、在需要进行校验的属性上增加校验类型注解
importjava.util.Date;importjavax.validation.constraints.Past;importorg.hibernate.validator.constraints.NotBlank;public classUser {privateString id;privateString username;
@NotBlank(message= "密码不能为空")privateString password;
@Past(message= "生日必须是过去的日期")privateDate birthday;
@JsonView(UserSimpleView.class)publicString getUsername() {returnusername;
}public voidsetUsername(String username) {this.username =username;
}publicString getPassword() {returnpassword;
}public voidsetPassword(String password) {this.password =password;
}publicString getId() {returnid;
}public voidsetId(String id) {this.id =id;
}publicDate getBirthday() {returnbirthday;
}public voidsetBirthday(Date birthday) {this.birthday =birthday;
}
}
2、在controller中增加注解
3、增加 BindingResult 获取错误信息
importjava.util.ArrayList;importjava.util.List;importjavax.validation.Valid;importorg.apache.commons.lang.builder.ReflectionToStringBuilder;importorg.apache.commons.lang.builder.ToStringStyle;importorg.springframework.data.domain.Pageable;importorg.springframework.validation.BindingResult;importorg.springframework.validation.FieldError;importorg.springframework.web.bind.annotation.DeleteMapping;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.PathVariable;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.PutMapping;importorg.springframework.web.bind.annotation.RequestBody;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importcom.fasterxml.jackson.annotation.JsonView;importcom.maple.dto.User;importcom.maple.dto.UserQueryCondition;importcom.maple.dto.User.UserDetailView;importcom.maple.dto.User.UserSimpleView;importcom.maple.exception.UserNotExitException;/***
*@authorhzc
**/@RestController
@RequestMapping("/user")public classUserController {
@PostMappingpublicUser createUser(@Valid @RequestBody User user, BindingResult errors) {if (errors.hasErrors()) { //判断是否有错误值
errors.getAllErrors().stream().forEach(error ->System.out.println(error.getDefaultMessage()));
}
System.out.println(user.getId());
System.out.println(user.getPassword());
System.out.println(user.getUsername());
System.out.println(user.getBirthday());
user.setId("1");returnuser;
}
}
API中已有的校验方法
(2)自定义校验方法
1、建立自定义注解类,@Target : 注解的范围,如方法,属性,类等 ; @Retention : 注解的生命周期,值为 RetentionnPolicy枚举类
packagecom.maple.validator;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;importjavax.validation.Constraint;importjavax.validation.Payload;
@Target({ ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy= MyConstraintValidator.class) //绑定下面自定义的校验方法
public @interfaceMyConstraint {//需要定义以下三个属性String message();
Class>[] groups() default{ };
Class extends Payload>[] payload() default{ };
}
2、定义校验方法,可在方法中使用 @Autowired 实现类的注入,在isValid中实现参数的验证。
packagecom.maple.validator;importjavax.validation.ConstraintValidator;importjavax.validation.ConstraintValidatorContext;importorg.springframework.beans.factory.annotation.Autowired;public class MyConstraintValidator implements ConstraintValidator{
@Overridepublic voidinitialize(MyConstraint constraintAnnotation) {
System.out.println("my validator init");
}
@Overridepublic booleanisValid(Object value, ConstraintValidatorContext context) {
helloService.greeting("Tom");
System.out.println(value);return false;
}
}
3、调用自定义的校验,在属性上增加自定义的注解 @MyConstraint
@MyConstraint(message = "这是一个测试")private String username;