gpt4 book ai didi

java - Spring 验证 : Requiring an exact length on an optional field

转载 作者:行者123 更新时间:2023-11-30 07:03:26 26 4
gpt4 key购买 nike

在 Spring MVC 中,我尝试使用注释来执行表单输入的验证。我有一些可选字段,但是当提供输入时,它必须满足特定条件。例如,我有一个字段可以留空,但当它被填写时,答案必须恰好是五个字符长。

我试过类似的东西

@Size(min=5, max=5)
private String value;

但如果用户没有填写该字段,则会给用户一个错误。

如何为可选字段提供一些“规则”?

最佳答案

  1. 第一个选项是将 设置为空。

如果您看一下 Hibernate 使用的 SizeValidatorForCharSequence:

/**
* Check that the length of a character sequence is between min and max.
*
* @author Emmanuel Bernard
* @author Gavin King
* @author Hardy Ferentschik
*/
public class SizeValidatorForCharSequence implements ConstraintValidator<Size, CharSequence> {

private static final Log log = LoggerFactory.make();

private int min;
private int max;

public void initialize(Size parameters) {
min = parameters.min();
max = parameters.max();
validateParameters();
}

/**
* Checks the length of the specified character sequence (e.g. string).
*
* @param charSequence The character sequence to validate.
* @param constraintValidatorContext context in which the constraint is evaluated.
*
* @return Returns <code>true</code> if the string is <code>null</code> or the length of <code>charSequence</code> between the specified
* <code>min</code> and <code>max</code> values (inclusive), <code>false</code> otherwise.
*/
public boolean isValid(CharSequence charSequence, ConstraintValidatorContext constraintValidatorContext) {
if ( charSequence == null ) {
return true;
}
int length = charSequence.length();
return length >= min && length <= max;
}

private void validateParameters() {
if ( min < 0 ) {
throw log.getMinCannotBeNegativeException();
}
if ( max < 0 ) {
throw log.getMaxCannotBeNegativeException();
}
if ( max < min ) {
throw log.getLengthCannotBeNegativeException();
}
}
}

仅当长度不匹配最小、最大限制时,大小才无效,如果值为 null,则没有问题。

  1. 另一种选择是创建您自己的注释和 validator :

    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
    @Retention(RUNTIME)
    @Documented
    @Constraint(validatedBy = { StringEmptyOrSizeValidator.class })
    public @interface StringEmptyOrSize {

    String message() default "{javax.validation.constraints.Size.message}";

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

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

    /**
    * @return size the element must be higher or equal to
    */
    int min() default 0;

    /**
    * @return size the element must be lower or equal to
    */
    int max() default Integer.MAX_VALUE;

    /**
    * Defines several {@link Size} annotations on the same element.
    *
    * @see Size
    */
    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
    @Retention(RUNTIME)
    @Documented
    @interface List {

    Size[] value();
    }
    }

有 validator

public class StringEmptyOrSizeValidator implements ConstraintValidator<Size, CharSequence> {

....
public boolean isValid(CharSequence charSequence, ConstraintValidatorContext constraintValidatorContext) {
if ( charSequence == null || charSequence.isEmpty()) {
return true;
}
int length = charSequence.length();
return length >= min && length <= max;
}

....
}

关于java - Spring 验证 : Requiring an exact length on an optional field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28422894/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com