#spring #binding #spring-mvc
#весна #привязка #spring-mvc
Вопрос:
У меня есть DTO (компонент) с ArrayList
полем:
public MyDTO {
...
private List<MyThing> things;
...
... getters, setters and so on
}
В моем InitBinder у меня есть:
@InitBinder
public void initBinder(WebDataBinder binder) {
...
binder.registerCustomEditor(List.class, "things", new PropertyEditorSupport() {
@Override
public void setAsText(String text) throws IllegalArgumentException {
List<MyThing> things = new ArrayList<MyThings>;
// fill things array with data from text
...
// On that stage things value is correct!
super.setValue(things);
}
});
}
И в моем методе запроса контроллера:
@RequestMapping({"save"})
public ModelAndView doSaveMyDTO(@ModelAttribute MyDTO myDTO) {
// very strange myDTO comes here=(
}
Проблема в том, что пока я в registerCustomEditor
штате things
, массив в порядке.
Но когда я добираюсь до doSaveMyDTO
метода — MyDTO.things
выглядит как массив из одноэлементных массивов фактических значений:
Ожидается (вещи в InitBinder):
[value1, value2, value3]
Получить в doSaveMyDTO (myDTO.getThings()):
[[value1], [value2], [value3]]
Почему? Пожалуйста, объясните…
Ответ №1:
Если запрос правильно сформирован ( things=v1amp;things=v2amp;things=v3
или things=v1,v2,v3
), встроенные преобразователи spring должны правильно преобразовать его в a List
— нет необходимости регистрировать свой собственный.
Если ваш ввод — JSON, то вам нужно @RequestBody
вместо @ModelAttribute
Комментарии:
1. к сожалению, у меня есть мой список в виде строки json.. В любом случае, спасибо за ваш совет — я постараюсь сделать это по-вашему…
2. ах, json — это другое дело. Как выглядит ваш json? И для этого, я думаю, вам многим понадобится @RequestBody