Bean验证以进行精确的字符串匹配

Kev*_*ave 1 java regex javabeans bean-validation

  1. 我想在bean验证中验证字符串是否完全匹配。我应该使用@Pattern还是使用其他方法?
  2. 如果@Pattern要走的路是什么regex
  3. 我可以@Pattern在同一字段的两个不同组中使用两个 注释吗?

Gun*_*nar 6

我想在bean验证中验证字符串是否完全匹配。我应该使用@Pattern还是使用其他方法?

您可以@Pattern非常轻松地使用或实现自定义约束:

@Documented
@Constraint(validatedBy = MatchesValidator.class)
@Target({ METHOD, CONSTRUCTOR, PARAMETER, FIELD })
@Retention(RUNTIME)
public @interface Matches {
    String message() default "com.example.Matches.message";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
    String value();
}
Run Code Online (Sandbox Code Playgroud)

使用这样的验证器:

public class MatchesValidator implements ConstraintValidator<Matches, String> {

    private String comparison;

    @Override
    public void initialize(Matches constraint) {
        this.comparison = constraint.value();
    }

    @Override
    public boolean isValid(
        String value,
        ConstraintValidatorContext constraintValidatorContext) {

        return value == null || comparison.equals(value);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果@Pattern要走的路是什么regex

基本上只是要匹配的字符串,只需要转义特殊字符,例如[\ ^ $。|?** +()。有关更多详细信息,请参见此参考

我可以在同一字段的两个不同组中使用两个@Pattern注释吗?

是的,只需使用@Pattern.List批注:

@Pattern.List({
    @Pattern( regex = "foo", groups = Group1.class ),
    @Pattern( regex = "bar", groups = Group2.class )
})
Run Code Online (Sandbox Code Playgroud)