Мне нужна помощь в связывании двух сущностей в весенней форме. На странице 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.