Передача объекта в Spring Form input скрыта SpringMVC

У меня проблема с объектом передачи (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) и его работы.

1
0
3 164
1

Ответы 1

Вам необходимо знать, как объект 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

У меня такая же ошибка, похоже, что CarType не создается, несмотря на то, что я передаю идентификатор, марку и модель. Когда я печатаю $ {car.carType.id} на JSP, у меня есть хороший идентификатор carType.

J.Doe 12.03.2018 10:08

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViol‌ ationException: столбец 'CAR_TYPE_ID' не может быть пустым

J.Doe 12.03.2018 10:12
MySQLIntegrityConstraintViolationException: связан с проблемой постоянного слоя. Дело не в привязке данных Spring mvc
Shafin Mahmud 12.03.2018 10:14

это происходит внутри вашего метода carService.updateCar(car);. вы пытаетесь сохранить Car и каскадные отношения с CarType, не давая никаких намеков об этом JPA

Shafin Mahmud 12.03.2018 10:16
imgur.com/q5YdGxU CarType по-прежнему равен NULL, я думаю, проблема в этой форме, но не знаю, почему springmvc не создает этот объект.
J.Doe 12.03.2018 10:22

В отладчике есть эта ошибка: не удалось преобразовать тип [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

J.Doe 12.03.2018 10:48

Я переопределяю метод CarType.toString, чтобы вернуть String.valueOf (id); теперь конвертер работает. Спасибо за помощь.

J.Doe 12.03.2018 10:59

Spring MVC по умолчанию использует метод toString для привязки данных. Но вы можете не захотеть переопределять toString для этого. Я тестировал ваш код локально на своей стороне. и не находит проблем с привязкой. Пожалуйста, проверьте свой код еще раз и выясните, что вы делаете не так. Всегда старайтесь следовать лучшим практикам

Shafin Mahmud 12.03.2018 11:16

Я пробовал этот способ, и он работает как шарм !. Огромное спасибо. :)

Evan Hu 27.03.2019 02:59

Другие вопросы по теме