Задать вопрос
dima_eam
@dima_eam

Spring MVC — как сохранить данные из чекбоксов в коллекцию?

Привет! В проекте есть класс Company, в котором имеется поле типа Set. Необходимо заполнять это поле значениями из чекбоксов, которые пользователь выбирает на странице.

Код JSP:
<td><form:checkboxes path="activities" items="${activities}" itemValue="id" itemLabel="name"/><br/>
<form:errors path="activities"/></td>


В контроллере есть метод с аннотацией @InitBinder для преобразования строк в элементы коллекции:
@InitBinder
    protected void initBinder(WebDataBinder binder) throws Exception {
        binder.registerCustomEditor(Set.class, "activities", new CustomCollectionEditor(Set.class) {
            @Override
            protected Object convertElement(Object element) {
                if(element instanceof Activity){
                    return element;
                }
                if (element instanceof String) {
                    Activity act = allAct.get(Integer.valueOf(element.toString()));
                    return act;
                }
                return null;
            }
        });
    }


Если выбрать только один чекбокс, то объект Company создается, если более одного - выдается сообщение об ошибке:
"Failed to convert property value of type java.lang.String[] to required type java.util.Set for property activities; nested exception is java.lang.NumberFormatException: For input string: "1,2""
Хотя метод initBinder вызывается и нормально создает объекты Activity.
  • Вопрос задан
  • 2920 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@carbon88
.NET developer/ORM developer
ну так тебе написали, что формат строки не верен. как я понял, в activities хранятся номера чекбоксов через запятую. потом в строке
Activity act = allAct.get(Integer.valueOf(element.toString()));

строка вида "1,2" (которая как раз содержится в сообщении об ошибке) приводится к целому числу и, есстественно, ничего не получается.
по идее нужно проверить один ли в activities элемент или последовательность и в случае последовательности разделить на конкретные элементы и скармливать их методу registerCustomEditor по одному
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы