Spring MVC валидация: требуется минимум одно поле. Как минимум одно обязательное поле - PullRequest
1 голос
/ 23 марта 2011

Я выполняю поиск по критерию с помощью объекта DTO для фильтра во внешней части моего приложения:

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;

}

и геттеры и сеттеры.

В моем контроллере :

@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, ...? Можно ли перебрать каждое свойство и проверить, не является ли одно из них нулевым? Чтобы узнать, заполнено ли одно поле? </p>

1 Ответ

0 голосов
/ 24 марта 2011

Если вам нужен этот тест очень часто, то стоило бы реализовать небольшую функцию, которая проверяет некоторые аннотированные поля 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;
}

Если это слишком много работы, то этобыло бы самым быстрым способом выполнить проверку традиционным рукописным способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...