请问@Validated如何在非controller方法中使用?

pointer
  • 2
新手上路,请多包涵

求助大神。最近需要做参数校验。根据网上的例子,都是在controller中直接对请求的参数进行校验。但是我目前的需求有点不一样:我希望先判断该请求参数中某一个字段的类型再进行参数校验。假如该请求是A类型任务,那我只校验abc字段,假如是B类型任务,那我只校验def字段这样。

所以我希望能在普通方法中进行校验,但实际结果却没有生效:

public class TaskValidator {
    private static final Logger logger = LogManager.getLogger("TaskValidatorLogger");
    public void validateTest(@Validated Test test) {
        logger.info("Validate: {}", test.getName());
    }

    public static void main(String[] args) {
        new TaskValidator().validateTest(new Test());
    }
}
@Data
public class Test {
    @NotNull(message = "name can not be null")
    private String name;
}

请问该如何解决呢

回复
阅读 6.5k
2 个回答
Richard_Yi
  • 2.2k
✓ 已被采纳

service中也是可以使用注解校验的,如果想要更灵活的使用JSR-303的参数校验方式,可以封装一个ValidationUtil。给你两篇参考文章你应该就会了。

  1. https://mp.weixin.qq.com/s/yZ...
  2. https://segmentfault.com/a/11...

希望可以帮到你哦。

/**
 * 参数校验工具类
 * NOTE: 具体使用参照测试类
 * @since 2019/5/7
 */
public class ValidationUtil {
    /**
     * 开启快速结束模式 failFast (true)
     */
    private static Validator failFastValidator = Validation.byProvider(HibernateValidator.class)
            .configure()
            .failFast(true)
            .buildValidatorFactory().getValidator();

    /**
     * 全部校验
     */
    private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
   

    private ValidationUtil() {
    }

    /**
     * 注解验证参数(快速失败模式)
     *
     * @param obj
     */
    public static <T> ValidResult fastFailValidate(T obj) {
        Set<ConstraintViolation<T>> constraintViolations = failFastValidator.validate(obj);
        //返回异常result
        if (constraintViolations.size() > 0) {
            return ValidResult.fail(constraintViolations.iterator().next().getPropertyPath().toString(), constraintViolations.iterator().next().getMessage());
        }
        return ValidResult.success();
    }

    /**
     * 注解验证参数(全部校验)
     *
     * @param obj
     */
    public static <T> ValidResult allCheckValidate(T obj) {
        Set<ConstraintViolation<T>> constraintViolations = validator.validate(obj);
        //返回异常result
        if (constraintViolations.size() > 0) {
            List<String> errorMessages = new LinkedList<String>();
            Iterator<ConstraintViolation<T>> iterator = constraintViolations.iterator();
            while (iterator.hasNext()) {
                ConstraintViolation<T> violation = iterator.next();
                errorMessages.add(String.format("%s:%s", violation.getPropertyPath().toString(), violation.getMessage()));
            }
            return ValidResult.fail(errorMessages);
        }
        return ValidResult.success();
    }
}
/**
 * @author Richard_yyf
 * @version 1.0 2019/5/17
 */
public class ValidationUtilTest {

    ParamTestDTO paramTestDTO = new ParamTestDTO();

    @Before
    public void setUp() {
        paramTestDTO.buildSuccess();
    }

    @Test
    public void fastFailValidate() {
        paramTestDTO.setTestNonNull(null);
        ValidResult validResult = ValidationUtil.fastFailValidate(paramTestDTO);
        System.out.println(JSON.toJSONString(validResult));
        Assert.assertTrue(validResult.isSuccess());
    }

    @Test
    public void allCheckValidate() {
        paramTestDTO.setTestNonNull(null);
        paramTestDTO.setTestTrue(false);
        ValidResult validResult = ValidationUtil.allCheckValidate(paramTestDTO);
        System.out.println(JSON.toJSONString(validResult));
        Assert.assertTrue(validResult.isSuccess());
    }


}

@Validated加到类(或者方法?)上
@Valid加到参数上
需要自己处理抛出的ConstraintViolationException

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏