Связать несколько объектов в форме Spring - PullRequest
0 голосов
/ 12 марта 2020

Мне нужна помощь в связывании двух сущностей в весенней форме. На странице cargo_edit. jsp я пытаюсь получить один Автомобиль go по идентификатору и связать его с Заказчиком из списка.

$ {tempCustomer} не может связать с Автомобилем go. BindingResult содержит такое сообщение об ошибке:

Ошибка поля в объекте 'car go' в поле 'customer': отклоненное значение [Customer (id = 1, name = Customer # 1] сообщение по умолчанию [Не удалось преобразовать свойство значение типа 'java .lang.String' в требуемый тип 'entity.customer.Customer' для свойства 'customer'; вложенное исключение: java .lang.IllegalStateException: Невозможно преобразовать значение типа 'java .lang.String 'в обязательный тип' entity.customer.Customer 'для свойства' customer ': не найдено подходящих редакторов или стратегии конверсии

Я думаю, что могу передать только $ {customer.id} как @RequestParam, но это выглядит чрезмерно. Может быть, есть какой-либо способ связать его непосредственно в форме и получить составной объект Car go с привязанным Customer как @ModelAttribute?

Спасибо!

Car go .class

public class Cargo {
    @ManyToOne
    private Customer customer;
}

Customer.class

public class Customer {
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "customer")
    private List<Cargo> cargoList;
}

CargoController .class

@Controller
public class CargoController {

    @GetMapping("/cargo_edit")
    public String editCargo(Model theModel,
                            @RequestParam("cargoId") int cargoId) {
        Cargo cargo = cargoService.getCargoById(cargoId);
        theModel.addAttribute("cargo", cargo);
        theModel.addAttribute("customers", customerService.getAllCustomers());
        return "cargo_edit";
    }


   @PostMapping("/saveCargo")
        public String saveCargo(@ModelAttribute("cargo") Cargo theCargo,
                            BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return "cargo_edit";
        } else {
            cargoService.saveCargo(theCargo);
        }
        return "redirect:/cargo";
    }
}

cargo_edit. jsp

<form:hidden path="id"/>

<form:form action="saveCargo" modelAttribute="cargo" method="post">
    <table>
        <th colspan="2">Add/Edit Cargo</th>

        <tr>
            <td>Customer:</td>
            <td>
                <form:select path="customer">
                    <c:forEach var="tempCustomer" items="${customers}">
                        <form:option value="${tempCustomer}" label="${tempCustomer.name}"/>
                    </c:forEach>
                </form:select>
            </td>
        </tr>
        <tr>
            <td><label></label></td>
            <td><input type="submit" value="Save cargo"></td>
        </tr>
    </table>
</form:form>

Up d. Я нашел ответ, и это довольно просто. Мне просто нужно добавить слой DTO.

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