spring 将两个验证注释合并为一个

问题描述 投票:0回答:2

我正在使用Spring+Hibernate+Spring-MVC
我想定义一个结合其他两个预定义验证注释的自定义约束:

@NotNull @Size
,如下所示:

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@NotNull
@Size(min=4)
public @interface JPasswordConstraint {
} // this is not correct. It's just a suggestion.

我想在我的表单模型中使用这个注释。

public class ChangePasswordForm {

  @NotNull
  private String currentPass;

  @JPasswordConstraint
  private String newPass;

  @JPasswordConstraint
  private String newPassConfirm;
}

用户控制器.java

@RequestMapping(value = "/pass", method = RequestMethod.POST)
public String pass2(Model model, @Valid @ModelAttribute("changePasswordForm") ChangePasswordForm form, BindingResult result) {
    model.addAttribute("changePasswordForm", form);
    try {
        userService.changePassword(form);
    } catch (Exception ex) {
        result.rejectValue(null, "error.objec", ex.getMessage());
        System.out.println(result);
    }
    if (!result.hasErrors()) {
        model.addAttribute("successMessage", "password changed successfully!");
    }
    return "user/pass";
}

但这不起作用。它接受少于 4 个字符的密码。
我该如何解决这个问题?

java spring validation spring-mvc annotations
2个回答
21
投票

这有点晚了,但是

中描述的组合验证注释的技术

https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/?v=5.4#section-constraint-composition

也许在撰写本文时尚不可用,但解决方案如下

@NotNull
@Size(min=4)
@Target({ METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = { })
@Documented
public @interface JPasswordConstraint {
    String message() default "Password is invalid";
    Class<?>[] groups() default { };
    Class<? extends Payload>[] payload() default { };
 }

7
投票

您可以通过以下方式将多个验证注释合并为一个:

(这是一个结合了

@Pattern(regexp = "[a-z]")
AND 的示例
@Size(min = 2, max = 3)

    @Pattern(regexp = "[a-z]")
    @Size(min = 2, max = 3)
    @ReportAsSingleViolation
    @Target({ METHOD, FIELD })
    @Retention(RUNTIME)
    @Constraint(validatedBy = { })
    public @interface PatternOrSize {
        String message() default "";

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

请注意,默认情况下注释条件遵循 AND 逻辑(即 all 必须为 true)。

对于特殊需求,可以使用OR逻辑。您可以使用

@ConstraintComposition(OR)

来做到这一点

例如,如果您想要

@NotNull
或 `@Size` ,请执行以下操作:

    @ConstraintComposition(OR) // <---
    @NotNull
    @Size(min = 2, max = 3)
    @ReportAsSingleViolation
    @Target({ METHOD, FIELD })
    @Retention(RUNTIME)
    @Constraint(validatedBy = { })
    public @interface PatternOrSize {
        String message() default "";

        Class<?>[] groups() default { };
    
        Class<? extends Payload>[] payload() default { };
    }
© www.soinside.com 2019 - 2024. All rights reserved.