springboot + JSR303 校验API数据
前言
必不可少的maven依赖
<!-- JSR303 校验 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
一、自定义注解
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Documented
@Constraint(
validatedBy = {SexValidConstraintValidator.class}
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface SexValid {
int[] value();
String message() default "{com.yang.shopping.common.valid.SexValid.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
二、自定义验证
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.Set;
public class SexValidConstraintValidator implements ConstraintValidator<SexValid, Integer> {
Set<Integer> integerSet = new HashSet<>();
@Override
public void initialize(SexValid constraintAnnotation) {
int[] integers = constraintAnnotation.value();
for (Integer a : integers) {
integerSet.add(a);
}
}
@Override
public boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) {
return integerSet.contains(integer);
}
}
三、ValidationMessages.properties文件
注解message 消息指向这个,默认消息提示
com.yang.shopping.common.valid.SexValid.message=The specified value must be filled in
com.yang.shopping.common.valid.IsIDCard.message=Wrong ID number
com.yang.shopping.common.valid.IsMobile.message=Wrong mobile number
四、使用
@Validated({DefaultGroup.class}) org.springframework.validation.annotation.Validated 提供,可以分组 没有标注分组注解的不会生效
@Valid 的区别 与使用 org.springframework.web.bind.annotation.* 提供,使用,@Valid 标注的分组的注解不会生效
import com.yang.shopping.common.valid.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserVo {
private Long id;
@NotNull(message = "密码不可以为空")
@Length(min = 6, max = 32, message = "密码长度需要在6和32之间")
private String password;
@NotBlank(message = "不能为空", groups = {DefaultGroup.class})
private String name;
@SexValid(value = {1, 0}, groups = {DefaultGroup.class})
private Integer sex;
@IsIDCard(groups = {DefaultGroup.class})
private String idCard;
}
import com.yang.shopping.common.valid.DefaultGroup;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@RestController
@RequestMapping("order/")
public class AppUserController {
@PostMapping("saveUser")
public UserVo saveUser(@RequestBody @Validated({DefaultGroup.class}) UserVo userVo) {
//查询价格
return userVo;
}
@PostMapping("saveUser2")
public UserVo saveUser2(@RequestBody @Valid UserVo userVo) {
//查询价格
return userVo;
}
}