有没有更简单的方法来进行DTO验证?

时间:2019-02-08 18:16:40

标签: java spring hibernate validation

当前,我正在Spring Boot项目中创建微服务。我喜欢使用javax.validation.constrainsts.*批注进行简单的验证工作的想法,例如检查NotNullSize验证,然后使用javax.validation.Validator一次性捕获所有这些验证约束。但是,如果我想为某些字段添加一些自定义验证(例如,如果我有一个年龄字段),并且如果该年龄大于18岁,我会检查该年龄是否有效,那么是否有更简便,更干净的方法来进行此类验证,考虑到我班上有很多领域。

看看现有的代码库,我发现其他人为每个字段编写了一个函数,该函数将验证特定字段。然后从一个位置调用所有此类函数以获取所有错误。似乎肯定有比这种方法更方便的方法。

我还知道我可以通过创建自己的注释来创建自己的javax约束验证,该注释是从here中学到的。除了编写自己的注释以及实现ConstraintValidator的另一个类之外,还有其他更简便的方法来做到这一点。顺便说一下,我正在使用Java 11,函数式编程方法也不错。

我想到了与创建自定义约束验证相同的过程。但是在注释中,我将添加另一个类似的字段

@Target({FIELD})
@Retention(RUNTIME)
@Constraint(validatedBy = Validator.class)
public @interface Validate {
 // Extra field 
 Function<Object, Boolean> func();

 String message() default "Invalid";

 Class<?>[] groups() default {};

 Class<? extends Payload>[] payload() default {};
}

所以现在我应该能够将自定义函数传递给注释,可以对所有字段使用相同的注释,但是可以根据需要使用不同的函数,例如:

@Validate(func = field1Validator)
private String field1;

@Validate(func = field2Validator)
private String field2;

这样做的好处是,我仍然可以一口气捕获所有约束冲突。但是这里的问题是java不允许注释中使用Function。

任何人和所有建议都将受到赞赏。

0 个答案:

没有答案