Нужна помощь с переплетом Set with Spring MVC form - PullRequest
4 голосов
/ 06 марта 2011

Я пытался последние 3 дня, но я не могу решить мою проблему

У меня есть Персона Класс

@SuppressWarnings("rawtypes")
 @OneToMany(cascade = CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="person")
 @JoinColumn(name="person_id")
 public Set<Book> books = new HashSet<Book>();

class Book

book_id
person_id

В моей форме JSP у меня есть

<c:forEach items="${BookList}" var="var1" varStatus="counter">
     <input type="checkbox" name="books[${counter.index}].book_id" value="${var1.book_id}" >${var1.book_name}</input>
    </c:forEach>

Я вставляю книги в таблицу в зависимости от флажков Список книг заполняется из модели refrenceData.

1011 * CONTROLLER *

@RequestMapping(value = "/persons/add", method = RequestMethod.GET)
    public String getAdd(Model model) {
        logger.debug("Received request to show add page");

        // Create new Person and add to model
        // This is the formBackingOBject
        model.addAttribute("personAttribute", new Person());

        // This will resolve to /WEB-INF/jsp/addpage.jsp
        return "hibernate/addpage";
    }



@RequestMapping(value = "/persons/add", method = RequestMethod.POST)
public String add(@Valid @ModelAttribute("personAttribute") Person person, BindingResult result) {
        logger.debug("Received request to add new person");

        if (result.hasErrors()) 
    return "hibernate/addpage";
        else
        personService.add(person);

    // This will resolve to /WEB-INF/jsp/addedpage.jsp
        return "hibernate/addedpage";
    }

Теперь, если у меня есть один объект Book, тогда это работает нормально, и данные вводятся в БД, но если я установил, это говорит о недействительной книге свойств [1]

После поисков в SO и Google я понял, что у меня есть два варианта

PropertyEditor
AutoPopulatingList

Я не знаю, как использовать их в моем случае. Кто-нибудь может мне помочь, где я должен их использовать и как его использовать

Ответы [ 3 ]

8 голосов
/ 06 марта 2011

Посмотрите на этот вопрос Привязка объектов в коллекции Set

Вам необходимо использовать другой тип коллекции.Я бы порекомендовал использовать Список вместо Карты.Когда вы отправляете из формы параметр с именем наподобие:

name="books[0].book_id"

SpringMVC будет искать в свойстве, называемом books (что является для вас Set), а затем попытается получить первый элемент, выполнивbooks.get (0).У Сета нет получения, потому что у Сета нет заказа.

Для реализации списка вы можете использовать AutoPopulationList.Это реализация отложенного списка, который создаст объект, если он не существует.Например, если вы вызываете books [0] .id и не добавили книгу в позицию 0 списка, она выдаст исключение NullPointerException, но если вы используете AutoPopulationList, она создаст новую книгу и добавит ее в эту позицию, еслиэта позиция пуста.

public List<Book> books = new AutoPopulatingList<Book>(new ElementFactory<Book>() {
    @Override
    public Book createElement(final int index) throws ElementInstantiationException {
         //call the constructor as you need
         return new Book();
    }       
});

Если вы собираетесь создать экземпляр с помощью конструктора Book по умолчанию (то есть Book ()), вы можете использовать такой синтаксис:

public List<Book> books = new AutoPopulatingList<Book>(Book.class);
1 голос
/ 05 августа 2015

Связывание Set невозможно с Spring MVC, поскольку наборы не имеют индексов для работы.Хотя вы можете перебирать множества в JSP и показывать результаты.Решения могут быть следующими:

  1. Используйте другой тип коллекции, например List.
  2. Оберните ваш Set в POJO, используйте ваш Set для отображения содержащих его значений в JSP.Как только вы захотите опубликовать форму, содержащую ваш выбор, добавьте новое свойство в свой POJO, которое является String (или аналогичным), и предоставьте это свойство как свой PATH в теге JSP, который будет получать данные выбора из JSP.Затем в бэкэнд-коде заполните свой набор этим значением.

В случае, если ваш POJO является также Entity для создания вашей базы данных с использованием Hibernate, просто поместите @Transient поверх него.Hibernate будет игнорировать это свойство при создании таблицы.

1 голос
/ 06 марта 2011

Когда у меня такая сложная форма, я искренне предпочитаю использовать JSON и отправлять ее с помощью AJAX.

{"person":{"id":1,"books":[{"person_id":2,"book_id":3},{"person_id":2,"book_id":6},{"person_id":3,"book_id":4}]}


@RequestMapping(value = "/persons/add", method = RequestMethod.POST)
@ResponseBody
     public String add(@RequestBody Person person){ 
//ad your business logic
}

Ваш код будет проверен десериализатором, и вы сможете сохранить его.Вы можете узнать больше об этом в этом посте:

http://blog.springsource.com/2010/01/25/ajax-simplifications-in-spring-3-0/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...