Весна в MVC - @действующую на список фасоль в остальные службы

Весной обслуживание в MVC остальные (в формате JSON), у меня есть метод контроллера, как этот :

@RequestMapping(method = RequestMethod.POST, value = { "/doesntmatter" })
@ResponseBody
public List<...> myMethod(@Valid @RequestBody List<MyBean> request, BindingResult bindingResult) {

Где класс MyBean есть аннотации валидации зерен.

Проверок Дон'т, кажется, чтобы иметь место в этом случае, хотя он хорошо работает и для других контроллеров.

Я Дон'т хотите, чтобы инкапсулировать список в ДТО этого, что бы менять вход с JSON.

Почему нет проверок список бобы ? Какие альтернативы ?


Комментарии к вопросу (1)
Решение

@Действительное-это в JSR-303 аннотации и JSR-303 применяется для проверки на модели. ЗначениеJava.утиль.Список не является JavaBean (по данным официальное описание к объектам JavaBean), следовательно, его нельзя проверить непосредственно с помощью портлетов JSR-303 уступчивый валидатор. Это подтверждается двумя наблюдениями.

В разделе 3.1.3 из Specification в JSR-303 говорит, что:

в дополнение к поддержке экземпляра проверки, проверка графиков объекта также поддерживается. Результатом проверки график будет возвращен в качестве единого свода нарушения ограничений. Рассмотрим ситуацию, когда бин X содержит поле типа Г. По аннотирования поля Y с @допустимым аннотации, оценщик проверяет Y (и его свойства), когда X проверка. Точный тип Z на значение, содержащееся в поле объявили типа Y (подкласс, реализация) определяется во время выполнения. Используемые определения ограничений Z являются. Это обеспечивает правильное полиморфное поведение для организаций, помеченные @действительна.

коллекции-стоимостью, оцененной массивом и вообще поля, повторяемое и свойства также могут быть украшены @действительный аннотация. В этом случае содержимое iterator, чтобы быть проверены. Любой объект реализация Java.яз.Итерируемым поддерживается.

Я отметил важные части информации жирным шрифтом. Данный раздел подразумевает, что для того, для коллекции типа для проверки, оно должно быть инкапсулировано внутри зерен (подразумевается рассмотрим ситуацию, когда в зернах X содержит поле введите Y); и далее, что коллекции не могут быть проверены непосредственно (подразумевается собрание уважаемых, различными значениями и, как правило, при обходе поля и свойства также могут быть оформлены с акцентом на поля и свойства).

фактические спецификации JSR-303 реализаций

Я образец заявления, что проверочные тесты коллекция с Hibernate и валидатор валидатор Апач бобы. При выполнении тестов на этом образце как команды mvn чистой тест -Phibernate (с спящий режим валидатора) и команды mvn чистой тест -Papache (для фасоль валидатор), как отказать в подтверждении коллекции, что вроде бы в соответствии со спецификацией. Поскольку валидатор гибернации является эталонной реализацией спецификации JSR-303, этот пример еще раз подтверждает, что коллекции должны быть инкапсулированы в зернах, чтобы быть проверены.


С этим прояснилось, я бы сказал, что существует также проблема проектирования в попытке передать коллекцию в метод контроллера напрямую, как это показано в вопрос. Даже если проверки к работе над коллекциями напрямую, метода контроллера, не смогут работать с альтернативными представлениями данных, таких как пользовательские XML, мыло, атом, ЭОД, буферы протокола Google и т. д. которые не отображаются непосредственно в коллекции. Для поддержки этих представлений, регулятор должен принять и вернуть экземпляры объекта. Это потребует инкапсуляция коллекции внутри экземпляра объекта любым способом. Поэтому было бы весьма желательно, чтобы обернуть список внутри другого объекта, как и другие ответы предложили.

Комментарии (0)

Единственный способ я нашел, чтобы сделать это, чтобы обернуть список, это также означает, что входной сигнал в JSON придется менять.

@RequestMapping(method = RequestMethod.POST, value = { "/doesntmatter" })
@ResponseBody
public List myMethod(@Valid @RequestBody List request, BindingResult bindingResult) {

становится:

@RequestMapping(method = RequestMethod.POST, value = { "/doesntmatter" })
@ResponseBody
public List myMethod(@Valid @RequestBody MyBeanList request, BindingResult bindingResult) {

и нам также нужны:

import javax.validation.Valid;
import java.util.List;

public class MyBeanList {

    @Valid
    List list;

    //getters and setters....
}

Похоже, это также может быть возможным с пользовательским validatior для списков, но я не получил, что далеко еще.

и GT; @действительный аннотация является частью стандарта JSR-303 API для проверки зернах, а не Весна-специфическим конструктом.

Весна MVC будет проверить @действительного объекта после привязки так долго, как соответствующий валидатор был настроен.

Ссылка : http://docs.spring.io/spring/docs/current/spring-framework-reference/html/validation.html

Комментарии (0)

С помощью com.Гугл.общие.собираем.ForwardingList

public class ValidList extends ForwardingList {

  private List list;

  public ValidList() {
    this(new ArrayList());
  }

  public ValidList(List list) {
    this.list = list;
  }

  @Override
  protected List delegate() {
    return list;
  }

  /** Exposed for the {@link javax.validation.Validator} to access the list path */
  public List getList() {
    return list;
  }
}

Так что не надо за фантик

вы можете использовать

@RequestMapping(method = RequestMethod.POST, value = { "/doesntmatter" })
@ResponseBody
public List myMethod(@Valid @RequestBody ValidList request, BindingResult bindingResult) {

С помощью фантик ваш формат JSON должен быть изменен на

{
  "list": []
}

с этой реализации можно использовать оригинальный формат JSON

[]
Комментарии (0)

Попробовать прямой проверки. Что-то вроде этого:

@Autowired
Validator validator;

@RequestMapping(method = RequestMethod.POST, value = { "/doesntmatter" })
@ResponseBody
public Object myMethod(@RequestBody List request, BindingResult bindingResult) {
    for (int i = 0; i < request.size(); i++) {
        Object o = request.get(i);
        BeanPropertyBindingResult errors = new BeanPropertyBindingResult(o, String.format("o[%d]", i));
        validator.validate(o, errors);
        if (errors.hasErrors())
            bindingResult.addAllErrors(errors);
    }
    if (bindingResult.hasErrors())
        ...
Комментарии (1)

Реализовать свой собственный валидатор с орг.springframework.проверки.beanvalidation.LocalValidatorFactoryBean как член и называют валидатор для каждого элемента.

public class CheckOutValidator implements Validator {

    private Validator validator;

   @Override
    public void validate(Object target, Errors errors) { 
    List request = (List) target;
    Iterator it = request.iterator()   
    while(it.hasNext()) {
    MyBean b = it.next();
    validator.validate(b, errors);

     }

     }

//setters and getters

}
Комментарии (0)

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

Комментарии (0)

Если вы Don'т хотите, чтобы написать программу-оболочку для каждого списка у вас есть, вы можете использовать универсальную оболочку:

public class ListWrapper {

    private List list;

    public ListWrapper() {
        list = new ArrayList();
    }

    public ListWrapper(List list) {
        this.list = list;
    }

    @Valid
    public List getList() {
        return list;
    }

    public void setList(List list) {
        this.list = list;
    }

    public boolean add(E e) {
        return list.add(e);
    }

    public void clear() {
        list.clear();
    }

}
Комментарии (0)

Я думаю, что лучшим вариантом является, чтобы обернуть список - https://stackoverflow.com/questions/16908689/how-to-validate-request-parameter-if-it-is-not-a-bean-in-spring-mvc

Нет возможности банкоматов, чтобы сказать, что @Valid относится к элементам коллекции.

Комментарии (1)
@Valid @RequestBody List request

у меня работает так долго, как вы представить допустимый JSON:-

[
    {
        "property1": "value1",
        "property2": "value2"
      },
    {
        "property1": "value3",
        "property2": "value4"
        }
]
Комментарии (1)