Идентификатор в форме редактирования Spring-MVC 2.5 с использованием @Controller - PullRequest
0 голосов
/ 31 января 2012

У меня проблема с кодом моего контроллера. GET работает нормально (обе пустые формы + форма, заполненная из базы данных), POST отлично работает только для создания нового объекта, но не работает для редактирование .Часть моего класса @Controller:

    @RequestMapping(value = "/vehicle_save.html", method = RequestMethod.GET)
public String setUpForm(@RequestParam(value="id", required = false) Long id, ModelMap model) {
    Vehicle v;
    if (id == null) {
        v =  new Vehicle();
    } else {
        v = vehicleManager.findVehicle(id);
    }
    model.addAttribute("vehicle", v);
    return "vehicle_save";
}

@RequestMapping(value = "/vehicle_save.html", method = RequestMethod.POST)
public String save(@ModelAttribute("vehicle") Vehicle vehicle, BindingResult result, SessionStatus status) {
    vehicleValidator.validate(vehicle, result);
    if (result.hasErrors()) {
        return "vehicle_save";
    } 
    if(vehicle.getId() == null) {
        vehicleManager.createVehicle(vehicle);  
    } else {
        vehicleManager.updateVehicle(vehicle);  
    }
    status.setComplete();
    return "redirect:vehicle_list.html";
}

Первый метод создает объект транспортного средства (включая его ID ).Но второй метод получает тот же объект без поля ID (значение равно нулю).

Что я могу сделать: вручную установить vehicle.setID (идентификатор из параметров) и затем сохранить его вбаза данных.Это вызывает JPAOptimisticLockException + мне не нравится это решение.

Есть ли способ передать мой объект Vehicle с идентификатором во второй метод?Кстати, я хотел бы избежать добавления скрытого поля ID в JSP.

Ответы [ 3 ]

2 голосов
/ 31 января 2012

В примере, который вы предложили, используется сеанс для сохранения значения.@SessionAttribute - привязать существующий объект модели к сеансу.Посмотрите на исходный код класса, помеченный @SessionAttributes("pet"). Это означает, что атрибут вашей модели с именем "pet" сохраняется в сеансе. Также посмотрите на код в методе processSubmit класса EditPetForm

    @RequestMapping(method = { RequestMethod.PUT, RequestMethod.POST })
    public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result, SessionStatus status) {
        new PetValidator().validate(pet, result);
        if (result.hasErrors()) {
            return "pets/form";
        }
        else {
            this.clinic.storePet(pet);
            status.setComplete(); //look at its documentation
            return "redirect:/owners/" + pet.getOwner().getId();
        }
    }

Iраньше я использовал что-то подобное. Но я полагаю, что вставка идентификатора в сеанс - это способ

1 голос
/ 31 января 2012

Кстати, я бы не хотел добавлять скрытое поле ID в JSP.

Это общее решение. Что с этим не так ? Вы должны создать скрытый ввод с идентификатором.

0 голосов
/ 31 января 2012

Может быть, вы можете попробовать использовать сессию, потому что вы не можете хранить информацию между двумя запросами.Но это будет ужаснее, я думаю.Кстати, не могли бы вы немного объяснить, почему вы хотите избежать добавления скрытых полей?Мне немного любопытно

...