2011-03-23 99 views
0

我用的DTO实体条件进行搜索的过滤在我的应用程序的前端:Spring MVC验证:至少需要一个字段。至少有一个领域需要

public class MyFilter implements Serializable { 

    private static final long serialVersionUID = 1L; 
    private String name; 
    @Enumerated(EnumType.STRING) 
    private AccessType accessType; 
    private List<MyType> userType; 
    private List<OfficeLocation> officeLocation; 
    private List<Language> languages; 
    private String country; 

} 

和getter和setter方法。

在我控制器

@RequestMapping 
public ModelAndView list(@ModelAttribute("filter") MyFilter myFilter, BindingResult result) {   
    final ModelAndView mav = new ModelAndView("list"); 
    // validate 
    MyFilterValidator.validate(myFilter, result); 
    mav.addObject("filter", myFilter); 
    if (result.hasErrors()) { 
     return mav; 
    } 
    // ... 
    return mav; 
} 

我想通过一个验证类验证搜索表单过滤器:

公共类MyFilterValidator实现org.springframework.validation.Validator {

@Override 
public void validate(Object object, Errors errors) { 
    final MyFilter myFilter = (MyFilter) object; 

    if (myFilter == null) { 
     errors.reject("error.one.field.required"); 
    } else { 
     if (StringUtils.isEmpty(myFilter.getName()) && myFilter.getAccessType() == null 
       && myFilter.getUserType() == null && myFilter.getLanguages() == null 
       && StringUtils.isEmpty(myFilter.getCountry()) 
       && myFilter.getOfficeLocation() == null) { 
      errors.reject("error.one.field.required"); 
     } 
    } 
} 

@Override 
public boolean supports(Class inClass) { 
    return MyFilter.class.equals(inClass); 
} 

}

我需要验证一个字段是否已填充,我的Filter类的最少一个字段已填充。我怎样才能以简单的方式做到这一点? 我需要检查每个属性:StringUtils.isEmpty或.size()< = 0,...? 是否有可能迭代每个属性并检查它们中的一个是否不为空? 要知道一个字段是否填写?

回答

0

如果你经常需要这个测试,那么实现一个小函数可以通过反射来检查DAO的一些注释字段。

public DAO { 
    public String nevermind; 

    @AtLeastOneOfThem 
    public String a; 

    @AtLeastOneOfThem 
    public String b; 
} 

/** 
    * Return True if at least on of the fields annotated by @AtLeastOneOfThem 
    * is not Empty. 
    * THIS IS PSEUDO CODE! 
    */ 
public static boolean atLeastOneOfThemIsNotEmpty(Object o) { 
    for(Field field : getFieldsAnnotatedWith(AtLeastOneOfThem.class, o) { 
     if (field.get() != null && !field.get().empty()) { 
     return true; 
     } 
    } 
    return false; 
} 

如果这是太多的工作,那么这将是fastet方式implment在tradtional手写方式的检查。

相关问题