Привязка Spring MVC: как привязать ArrayList ?

#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