Spring MVC: как соединить две модели в одну таблицу - PullRequest
0 голосов
/ 12 февраля 2019

Я готовлю проект, в котором у меня есть две реляционные таблицы.Тип отношения - один ко многим.Это библиотечная система.У меня есть одна таблица для книг и одна таблица для клиентов.

rent-form.jsp:

<h1>${book.title}</h1>

        <form:form action="rentBook" modelAttribute="book" method="POST">
        <!--  need to associate this data with customer id -->
        <form:hidden path="id" />

        <table>
            <tbody>
                <tr>
                    <td><label>Rental Date:</label></td>
                    <td><spring:bind path="book"><form:input path="rentalDate" /></spring:bind></td>
                </tr>

                <tr>

                    <td><label>Return Date:</label></td>
                    <td><spring:bind path="book"><form:input path="returnDate" /></spring:bind></td>
                </tr>

                <tr>
                    <td><label>Client:</label></td>
                    <td>
                    <form:select path="client">
                        <form:option value="NONE" label="--- Select ---" />
                        <c:forEach var="tempClient" items="${client}">
                         <form:option value="${tempClient.id}">${tempClient.id} ${tempClient.firstName} ${tempClient.lastName}</form:option>
                        </c:forEach>
                    </form:select>
                    </td>
                </tr>


                <tr>
                    <td><label></label></td>
                    <td><input type="submit" value="Save" class="save" /></td>
                </tr>
            </tbody>
        </table>        
        </form:form>

BookController.java:

@RequestMapping("/showFormForRent")
public String showFormForRent(@RequestParam("bookId") int theId, Model theModel) {

    List<Client> theClients = bookService.getClients();

    theModel.addAttribute("client", theClients);

    Book theBook = bookService.getBook(theId);

    theModel.addAttribute("book", theBook);


    return "rent-form";
}
@PostMapping("/rentBook")
public String rentBook(@ModelAttribute("book") Book theBook, @ModelAttribute("client") Client theClient) {

    theBook.setClient(theClient);
    bookService.saveBook(theBook);

    return "redirect:/book/list-books";
}

Что я хочуЯ хочу получить клиентов из детализации, затем я хочу выбрать (я выбираю в раскрывающемся меню) и добавить клиента в книгу, используя Book.setClient (theClient).В этом случае в таблице «книга» у меня должен быть идентификатор клиента.Более того, в этой форме я хочу добавить дату аренды и дату возвращения.

Диаграмма базы данных:

enter image description here

Я не уверен, что мой подход правильный, сейчас я получил сообщение об ошибке:

HTTP Status 400 – Bad Request

The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).

Я предполагаю, что это связано с моделью в одной форме.Возможно, Spring не знает, что делает модель клиента в форме книги.Есть ли у вас, ребята, какие-либо советы для меня, пожалуйста?

1 Ответ

0 голосов
/ 15 февраля 2019

Вам необходимо создать и зарегистрировать конвертер.

Вы связываете select

<form:select path="client">

со свойством client в книге.Браузер отправляет только идентификатор, поэтому вам нужно указать Spring, как преобразовать этот идентификатор в экземпляр клиента.

См. 6.5.1 Преобразователь SPI в https://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/validation.html

package org.springframework.core.convert.support;

final class StringToClient implements Converter<String, Client> {

    //wire in repository

    public Client convert(String source) {
        return clientRepo.find(Integer.valueOf(source));
    }

}

С этим ваш код контроллера будет таким, как показано ниже, т.е. клиент, возвращаемый преобразователем, автоматически привязывается к книге с помощью инфраструктуры MVC.

@PostMapping("/rentBook")
public String rentBook(@ModelAttribute("book") Book theBook) {

    bookService.saveBook(theBook);

    return "redirect:/book/list-books";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...