2

フロントエンド側には、いくつかのオプションで満たされた選択ボックスを含むフォームがあります。モデルには、カスタム制約によって検証されるフィールドが含まれています。

private @Options(values=OptionKeys.SALUTATIONS) String salutation;

これはうまくいきます。今、次のスニペットを使用するフロントエンド側にチェックボックスまたは複数値の選択ボックスが必要です。

private @Options(values=OptionKeys.INTERESTS, optional=true) String[] interests;

制約インターフェイスとバリデータ コードは次のとおりです。

@Target( { METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = OptionsValidator.class)
@Documented
public @interface Options {
    String message() default "{com.example.web.form.constraints.Options.message}";
    Class<? extends Payload>[] payload() default {};
    Class<?>[] groups() default {};
    boolean optional() default false;
    OptionKeys values();
}

public class OptionsValidator implements ConstraintValidator<Options, String> {

    private List<String> values;
    private boolean optional;

    @Override
    public void initialize(Options params) {
        values = Arrays.asList(params.values().data);
        optional = params.optional();
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
        if (optional && StringUtils.isBlank(value)) {
            return true;
        }

        return value != null && values.contains(value);
    }

}

public static enum OptionKeys {
    SALUTATIONS(new String[] {
            "m",
            "f"
    }),

    INTERESTS(new String[] {
            "dummy"
    });

    public final String[] data;
    OptionKeys(String[] data) {
        this.data = data;
    }
}

何らかの方法でバリデーターを拡張してString[]値もチェックすることは可能ですか、それとも別の値を書く必要がありますか (例: @MultiOptions)?

4

2 に答える 2

1

Object次のように使用してそのタイプを確認できますinstanceof

public class OptionsValidator implements ConstraintValidator<Options, Object> {
    private List<String> values;
    private boolean optional;

    @Override
    public void initialize(Options params) {
        values = Arrays.asList(params.values().data);
        optional = params.optional();
    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext constraintValidatorContext) {
        if (optional && value == null) {
            return true;
        }

        if (value instanceof String[]) {
            String[] valArray = (String[]) value;
            if (!optional && valArray.length == 0) {
                return false;
            }

            for (String val : valArray) {
                if (!values.contains(val)) {
                    return false;
                }
            }

            return true;
        } else if (value instanceof String) {
            String val = (String) value;
            if (optional && val.trim() == "") {
                return true;
            }

            return val != null && values.contains(val);
        }

        return false;
    }
}
于 2013-07-09T13:15:05.713 に答える