hibernate 显示其他约束详细信息的Java @NotNull违规消息

yhxst69z  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(164)

如果username字段不能为null,长度必须介于4到64个字符之间,并且与regexp [A-Za-z0-9]+匹配,则当username字段为空时,错误消息仅为:期望的结果是must not be null AND length must be between 4 and 64 characters AND must match "[A-Za-z0-9]+"
初始设置:

@NotNull
@Length(min = 4, max = 64)
@Pattern(regexp = "[A-Za-z0-9]+")
String username;

我还尝试了:

@NotNull(message = """
        {jakarta.validation.constraints.NotNull.message} 
        AND {org.hibernate.validator.constraints.Length.message} 
        AND {jakarta.validation.constraints.Pattern.message}""")
@Length(min = 4, max = 64)
@Pattern(regexp = "[A-Za-z0-9]+")
String username;

但后者的结果是:

ConstraintViolationImpl{
  interpolatedMessage='must not be null AND length must be between {min} and {max} AND must match "{regexp}"',
  propertyPath=username, rootBeanClass=class app.User,
  messageTemplate='{jakarta.validation.constraints.NotNull.message} AND {org.hibernate.validator.constraints.Length.message} AND {jakarta.validation.constraints.Pattern.message}'}

未访问约束(minmaxregexp)的值。如何在错误消息中呈现这些约束的实际值?

vjrehmav

vjrehmav1#

大多数约束注解,包括@Length@Pattern,都将null视为有效输入,这就是为什么仅仅使用这些注解无法得到所需结果的原因。
幸运的是,通过引入一个新的约束注解,可以很容易地完成您想要的任务:

@Constraint(validatedBy = {}) // no validator needed, it delegates to other constraints
@NotNull
@Length(min = 4, max = 64)
@Pattern(regexp = "[A-Za-z0-9]+")
@ReportAsSingleViolation // to prevent separate violations for the other constraints
@Target(FIELD)
@Retention(RUNTIME)
public @interface ValidUsername {

    String message() default """
        {jakarta.validation.constraints.NotNull.message} 
        AND {org.hibernate.validator.constraints.Length.message} 
        AND {jakarta.validation.constraints.Pattern.message}""";

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

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

这是用约束进行注解的,这意味着在选中此注解时将应用这些约束。
消息仍将包含占位符{min}等,因为这些不是此约束本身的属性。您可以通过两种方式解决此问题:
1.不要使用模板,而是对消息进行硬编码
1.将这些属性也添加到注解中,并告诉Bean验证框架将这些属性用于其他注解:

@OverridesAttribute(constraint = Length.class)
    int min() default 4;

    @OverridesAttribute(constraint = Length.class)
    int max() default 64;

    @OverridesAttribute(constraint = Pattern.class)
    String regexp() default "[A-Za-z0-9]+";

现在您需要做的就是将username字段上的注解替换为@ValidUsername

相关问题