@Valid不生效:基于@Valid校验工具类
很多时候我们都需对api的参数进行规则检验,校验,如不能为空,长度限制,电话号码等等。一般我都使用validation的@Valid注解,再在相应的参数上加上如@NotBlank之类的注解来实现校验,但是在一些特殊的场景下@Valid注解不会生效,也就不会对参数校验,比如service接口我需要校验,所以基于validation封装了如下工具类。其中用到的EmptyChecker工具类见: java常用判空工具类_百块富翁的博客-CSDN博客_java判空工具类
import com.alibaba.fastjson.JSON;
import org.hibernate.validator.HibernateValidator;import javax.validation.*;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.*;/*** @ClassName 自定义参数校验器* @Description 在service层Validator的@Valid注解无法生效,使用以下方法可以对Validation的相关注解生效,如@NotNull* 如果对象内包含对象,下层对象仍需校验,请使用 @Valid 标识* 注意:目前不支持内部类* @Author miss you BUG* @Date 2021/8/12 16:11* @Email rkj01135525@cainiao.com*/
public class ValidUtil {//初始化检查器。static ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class).configure().failFast(false).buildValidatorFactory();static Validator validator = validatorFactory.getValidator();public static void validChecker(Object object) {List> result = new ArrayList<>();serviceValid(object, result);if (EmptyChecker.notEmpty(result)) {throw new RuntimeException(JSON.toJSONString(result));}}private static void serviceValid(Object object, List> result) {try {LinkedHashMap msg = new LinkedHashMap<>();//检查objectSet> set = validator.validate(object);List list = new ArrayList<>();//循环set,获取检查结果for (ConstraintViolation
使用方法:在参数上还是一样的使用@NotNull之类的注解,在服务中手动的调用工具类方法把需校验的参数传进去。
eg:
@Data
public class User{@NotNullprivate Integer id;@NotBlankprivate String name;//下层对象需校验需使用@Valid注解@Validprivate Order order}
@Data
public class Order{@NotNullprivate Long id;@NotBlankprivate String code;}
public class TsetServiceImpl{public boolean validTest(User user){//参数校验ValidUtil.validChecker(user);return true;}}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
