2013-07-09 63 views
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)?

回答

0

人們可以使用Objectinstanceof檢查它的類型:

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

截至目前尚無更好的解決方案(甚至還有一個更好的),這是公認的答案。 – dtrunk