0
在前端一側有一個包含選擇框的表單,其中包含一些選項。該模型包含一個字段,該字段將通過我的自定義約束進行驗證:不同類型的自定義約束(驗證器)
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
)?
截至目前尚無更好的解決方案(甚至還有一個更好的),這是公認的答案。 – dtrunk