在前端,有一个包含一个包含一些选项的选择框的表单。该模型包含一个字段,该字段将通过我的自定义约束进行验证:
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
)?
一个人可以使用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;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句