我知道之前曾有人问过这个问题,但是很遗憾,我无法获得答案(How to validate field level constraint before class level constraint?)。
我有以下Pojo:
@ValidBalanceData(allowableBalanceDifference = 0.01)
public class Mutation {
@NotNull() private BigDecimal balanceBefore;
@NotNull() private BigDecimal balanceAfter;
@NotNull() private BigDecimal amount;
....
}
我已经实现了ValidBalanceData批注:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = BalanceDataConstraintChecker.class)
public @interface ValidBalanceData {
String message() default "{nl.smith.balanceData.message}";
double allowableBalanceDifference();
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
我还实现了validatedBy类。 不幸的是,ValidBalanceData约束先于NotNull约束进行验证。由于ValidBalanceData约束假定balanceBefore,balanceAfter和amount值不为null,因此将导致Nullpointer异常。我该如何解决这个问题? 有人可以给我一个有效的示例(使用@GroupSequence和字段)吗?
答案 0 :(得分:2)
我找到了答案:
@GroupSequence({ FieldChecks.class, Mutation.class })
@ValidBalanceData(allowableBalanceDifference = 0.01, groups = Default.class)
public class Mutation {
private Integer id;
@NotNull(groups = FieldChecks.class)
private BigDecimal balanceBefore;
@NotNull(groups = FieldChecks.class)
private BigDecimal balanceAfter;
@NotNull(groups = FieldChecks.class)
private BigDecimal amount;
....
}
FieldChecks是用户定义的空标记接口,而javax.validation.groups.Default来自验证jar。