- 创建一个注解
package com.atguigu.common.annotation;
import com.atguigu.common.annotation.validated.YgqListValueValidated;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Documented
@Constraint(validatedBy = {YgqListValueValidated.class})
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface YgqListValue {
String message() default "{com.atguigu.common.annotation.YgqListValue.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
int[] vals() default {};
}
- 我们可以在resources里面创建ValidationMessages来配置message默认值
- 定义校验器,校验值
package com.atguigu.common.annotation.validated;
import com.atguigu.common.annotation.YgqListValue;
import org.springframework.validation.annotation.Validated;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
public class YgqListValueValidated implements ConstraintValidator<YgqListValue, Integer> {
private HashSet<Integer> set = new HashSet<>();
@Override
public void initialize(YgqListValue constraintAnnotation) {
int[] vals = constraintAnnotation.vals();
for (int val : vals) {
set.add(val);
}
}
@Override
public boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) {
return set.contains(integer);
}
}
- 定义自定义异常,方便统一返回指定错误json
package com.atguigu.gulimall.product.exception;
import com.atguigu.common.exception.HttpCode;
import com.atguigu.common.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.HashMap;
@Slf4j
@RestControllerAdvice
public class GulimallExceptionControllerAdvice {
@ExceptionHandler(value = org.springframework.web.bind.MethodArgumentNotValidException.class)
public R handleVaildException(org.springframework.web.bind.MethodArgumentNotValidException e){
HashMap<String, String> errMap = new HashMap<>();
BindingResult bindingResult = e.getBindingResult();
for (FieldError fieldError : bindingResult.getFieldErrors()) {
errMap.put(fieldError.getField(),fieldError.getDefaultMessage());
}
return R.error(HttpCode.FIELD_NONCOMPLIANCE.getCode(),HttpCode.FIELD_NONCOMPLIANCE.getMessage()).put("data",errMap);
}
@ExceptionHandler(value = Exception.class)
public R handleException(Exception e){
log.error(e.getMessage(),e.getClass());
return R.error(HttpCode.UNKNOW_EXCEPTION.getCode(),HttpCode.UNKNOW_EXCEPTION.getMessage());
}
}
- 使用@YgqListValue 注解,vals就是指定0,1如果传递进来showStatus是0或者1,那么就校验通过,否则就返回异常给前端,
@Data
@TableName("pms_brand")
public class BrandEntity implements Serializable {
private static final long serialVersionUID = 1L;
@YgqListValue(vals={0,1})
private Integer showStatus;
}
- controller
@RequestMapping("/save")
public R save(@Valid @RequestBody BrandEntity brand){
brandService.save(brand);
return R.ok();
}
- 结果
传递3就报错异常,会被我们自定义注解校验
传递0或者1,就通过我能自定义注解校验成功