У меня проблема с объектом передачи (CarType) в форме ввода Spring.
Моя модель автомобиля:
@Entity
@Table(name = "CAR")
public class Car implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "CAR_ID", unique=true, nullable=false)
private long id;
@NotEmpty
@Column(name = "REG_NO", nullable=false)
private String regNo;
@NotEmpty
@Column(name = "YEAR", nullable=false, length = 4)
private String year;
@Column(name = "AVAILABLE", nullable=false)
private boolean available = true;
@Column(name = "START_DATE")
private String startDate;
@Column(name = "RETURN_DATE")
private String returnDate;
@OneToOne
@JoinColumn(name = "CAR_TYPE_ID")
private CarType carType;
//getters and setters
Модель автомобиля:
@Entity
@Table(name = "CAR_TYPE")
public class CarType {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "CAR_TYPE_ID", unique=true, nullable=false)
private int id;
@NotEmpty
@Column(name = "MARK", nullable=false)
private String mark;
@NotEmpty
@Column(name = "MODEL", nullable=false)
private String model;
//getters and setters
Контроллеры:
@RequestMapping(value = { "/rent-car-{regNo}" }, method = RequestMethod.GET)
public String rentCar(@PathVariable String regNo, ModelMap model) {
Car car = carService.findCarByRegNo(regNo);
model.addAttribute("car", car);
return "rentcar";
}
@RequestMapping(value = { "/rent-car-{regNo}" }, method = RequestMethod.POST)
public String saveRentCar(@Valid Car car, BindingResult result, ModelMap model) {
carService.updateCar(car);
model.addAttribute("success", "Car " + car.getRegNo() + " rented successfully");
return "registrationsuccess";
}
Файл JSP
<form:form method = "POST" modelAttribute = "car" class = "form-horizontal">
<form:input type = "hidden" path = "id" id = "id"/>
<form:input type = "hidden" path = "year" id = "year"/>
<form:input type = "hidden" path = "regNo" id = "regNo"/>
<form:input type = "hidden" path = "available" id = "available"/>
<form:input type = "hidden" path = "carType" id = "carType"/>
<form:input type = "text" path = "startDate" id = "startDate"/>
<form:input type = "text" path = "returnDate" id = "returnDate"/>
У меня проблема с этим кодом
<form:input type = "hidden" path = "carType" id = "carType"/>
как передать объект CarType в форму автомобиля? У меня всегда такая же ошибка: столбец CAR_TYPE_ID не может быть нулевым. Похоже, я передаю CarType нулевой тип. Я не знаю почему? Кто-нибудь может мне помочь? В registercar.jsp я использовал конвертер (конвертировать regNo в класс CarType) и его работы.
Вам необходимо знать, как объект Car привязывается к методу обработчика контроллера из HTTP-запроса от клиента. Spring MVC сопоставляет параметры запроса для создания объекта Car. Следовательно, CarType является ассоциированным объектом. Вам нужно предоставить минимальный ключ к Spring MVC, чтобы создать его для вас.
<form:form method = "POST" action = "/rent-car${regNo}" modelAttribute = "car">
......
<form:input type = "hidden" path = "carType.id"/>
<form:input type = "hidden" path = "carType.model"/>
<form:input type = "hidden" path = "carType.mark"/>
<input type = "submit" value = "Submit"/>
</form:form>
вы найдете дополнительный пример здесь - это статья Spring MVC - привязка параметров запроса и переменных пути к объектам поддержки Java
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViol ationException: столбец 'CAR_TYPE_ID' не может быть пустым
MySQLIntegrityConstraintViolationException: связан с проблемой постоянного слоя. Дело не в привязке данных Spring mvc
это происходит внутри вашего метода carService.updateCar(car);. вы пытаетесь сохранить Car и каскадные отношения с CarType, не давая никаких намеков об этом JPA
В отладчике есть эта ошибка: не удалось преобразовать тип [java.lang.String] в тип [@ javax.persistence.OneToOne @ javax.persistence.JoinColumn com.rentcar.app.model.CarType] для значения 'BMW X5'; вложенное исключение - java.lang.NumberFormatException: для входной строки: "BMW X5"] Где BMW X5 - CarType.toString
Я переопределяю метод CarType.toString, чтобы вернуть String.valueOf (id); теперь конвертер работает. Спасибо за помощь.
Spring MVC по умолчанию использует метод toString для привязки данных. Но вы можете не захотеть переопределять toString для этого. Я тестировал ваш код локально на своей стороне. и не находит проблем с привязкой. Пожалуйста, проверьте свой код еще раз и выясните, что вы делаете не так. Всегда старайтесь следовать лучшим практикам
Я пробовал этот способ, и он работает как шарм !. Огромное спасибо. :)
У меня такая же ошибка, похоже, что CarType не создается, несмотря на то, что я передаю идентификатор, марку и модель. Когда я печатаю $ {car.carType.id} на JSP, у меня есть хороший идентификатор carType.