4

Spring MVC では、アノテーションを使用してフォーム入力の検証を実行しようとしています。オプションのフィールドがいくつかありますが、入力が提供される場合、特定の基準を満たす必要があります。たとえば、空白のままにできるフィールドが 1 つありますが、それを入力すると、答えは正確に 5 文字の長さでなければなりません。

私は次のようなことを試しました

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

ただし、ユーザーがフィールドに入力しないと、ユーザーにエラーが発生します。

オプションのフィールドにいくつかの「ルール」を提供するにはどうすればよいですか?

4

3 に答える 3

4
  1. 最初のオプションは、を null に設定することです。

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. 別のオプションは、独自の注釈とバリデータを作成することです。

    @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();
        }
    }
    

バリデータ付き

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;
    }

    ....
}
于 2015-02-10T06:23:03.340 に答える
0

より簡単な解決策は、クラスにメソッドを追加し、次のように @AssertTrue アノテーションを追加することです。

@AssertTrue
public boolean isValidValue() {
        if(this.value == null || this.value.isEmpty()) {
            return true;
        }
        else {
            return this.value.length() == 5 ? false: true;
        }
    }

これで、これは必要ありません:@Size(min=5, max=5)

于 2019-08-24T20:37:45.310 に答える