Весной обслуживание в MVC остальные (в формате JSON), у меня есть метод контроллера, как этот :
@RequestMapping(method = RequestMethod.POST, value = { "/doesntmatter" })
@ResponseBody
public List<...> myMethod(@Valid @RequestBody List<MyBean> request, BindingResult bindingResult) {
Где класс MyBean есть аннотации валидации зерен.
Проверок Дон'т, кажется, чтобы иметь место в этом случае, хотя он хорошо работает и для других контроллеров.
Я Дон'т хотите, чтобы инкапсулировать список в ДТО этого, что бы менять вход с JSON.
Почему нет проверок список бобы ? Какие альтернативы ?
@Действительное-это в 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 и т. д. которые не отображаются непосредственно в коллекции. Для поддержки этих представлений, регулятор должен принять и вернуть экземпляры объекта. Это потребует инкапсуляция коллекции внутри экземпляра объекта любым способом. Поэтому было бы весьма желательно, чтобы обернуть список
внутри другого объекта, как и другие ответы предложили.
Единственный способ я нашел, чтобы сделать это, чтобы обернуть список, это также означает, что входной сигнал в JSON придется менять.
@RequestMapping(method = RequestMethod.POST, value = { "/doesntmatter" })
@ResponseBody
public List<...> myMethod(@Valid @RequestBody List<MyBean> 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<MyBean> list;
//getters and setters....
}
Похоже, это также может быть возможным с пользовательским validatior для списков, но я не получил, что далеко еще.
и GT; @действительный аннотация является частью стандарта JSR-303 API для проверки зернах, а не Весна-специфическим конструктом.
Весна MVC будет проверить @действительного объекта после привязки так долго, как соответствующий валидатор был настроен.
Ссылка : http://docs.spring.io/spring/docs/current/spring-framework-reference/html/validation.html
С помощью com.Гугл.общие.собираем.ForwardingList
public class ValidList<T> extends ForwardingList<T> {
private List<@Valid T> list;
public ValidList() {
this(new ArrayList<>());
}
public ValidList(List<@Valid T> list) {
this.list = list;
}
@Override
protected List<T> delegate() {
return list;
}
/** Exposed for the {@link javax.validation.Validator} to access the list path */
public List<T> getList() {
return list;
}
}
Так что не надо за фантик
вы можете использовать
@RequestMapping(method = RequestMethod.POST, value = { "/doesntmatter" })
@ResponseBody
public List<...> myMethod(@Valid @RequestBody ValidList<MyBean> request, BindingResult bindingResult) {
С помощью фантик ваш формат JSON должен быть изменен на
{
"list": []
}
с этой реализации можно использовать оригинальный формат JSON
[]
Попробовать прямой проверки. Что-то вроде этого:
@Autowired
Validator validator;
@RequestMapping(method = RequestMethod.POST, value = { "/doesntmatter" })
@ResponseBody
public Object myMethod(@RequestBody List<Object> 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())
...
Реализовать свой собственный валидатор с орг.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
}
Есть элегантный способ фантик вашему запросу в заказ Ява.утиль.Список
, который действует как список
и классе
. см. здесь
Если вы Don'т хотите, чтобы написать программу-оболочку для каждого списка у вас есть, вы можете использовать универсальную оболочку:
public class ListWrapper<E> {
private List<E> list;
public ListWrapper() {
list = new ArrayList<>();
}
public ListWrapper(List<E> list) {
this.list = list;
}
@Valid
public List<E> getList() {
return list;
}
public void setList(List<E> list) {
this.list = list;
}
public boolean add(E e) {
return list.add(e);
}
public void clear() {
list.clear();
}
}
Я думаю, что лучшим вариантом является, чтобы обернуть список - https://stackoverflow.com/questions/16908689/how-to-validate-request-parameter-if-it-is-not-a-bean-in-spring-mvc
Нет возможности банкоматов, чтобы сказать, что @Valid относится к элементам коллекции.
@Valid @RequestBody List<MyBean> request
у меня работает так долго, как вы представить допустимый JSON:-
[
{
"property1": "value1",
"property2": "value2"
},
{
"property1": "value3",
"property2": "value4"
}
]