Spring Framework - Новый объект создается в БД вместо обновления - PullRequest
0 голосов
/ 22 сентября 2010

У меня есть приложение, написанное на Spring 3.0, подключенное с помощью Hibernate к базе данных.У меня есть контроллер для формы обновления.Всякий раз, когда форма отправляется, я ожидаю, что отображаемый объект будет обновлен, однако новый объект будет создан с новым значением идентификатора.Я просмотрел образец "petclinic" и не вижу, чем он отличается.

POJO

public class Person
{
    private int id;

    @NotNull
    private String name;

    //getter/setter for id
    //getter/setter for name

}

Контроллер

public class PersonUpdateController
{
    //injected
    private PersonService personService;

    @RequestMapping(value="/person/{personId}/form", method=RequestMethod.POST) 
    public String updateForm(ModelMap modelMap, @PathVariable personId)
    {
        Person person = personService.getById(personId);
        modelMap.addAttribute(person);
        return "person/update";     
    }

    @RequestMapping(value="/person/{personId}", method=RequestMethod.POST)
    public String update(ModelMap modelMap, @Valid Person person, BindingResult bindingResult)
    {
        if(bindingResult.hasErrors())
        {
            modelMap.addAttribute(person);
            return "person/update";
        }

        personService.save(person);

        return "redirect:person/" + person.getId() + "/success";
    }
}

JSP

<spring:url value="/person/${person.id}" var="action_url" />
<spring:form action="${action_url}" modelAttribute="person" method="POST">

<spring:input name="name" path="name" />

<input type="submit" value="Save" />

</spring:form>

Внедрение PersonService

public class HibernatePersonService
    implements PersonService
{
    //injected
    private SessionFactory sessionFactory;

    //other methods

    public void save(Person person)
    {
        Session session = sessionFactory.getCurrentSession();
        session.saveOrUpdate(person);
    }
}

1 Ответ

4 голосов
/ 22 сентября 2010

Spring MVC не работает с HTML-формами.Поскольку ваша форма содержит только одно поле, вы получаете только одно поле, заполненное в методе обновления.Итак, у вас есть два варианта:

  • Передача id в качестве скрытого поля в форме: <spring:hidden path = "id" />.Обратите внимание, что в этом случае вам необходимо проверить возможные последствия для безопасности (что произойдет, если злоумышленник изменит идентификатор).
  • Сохранить Person в сеансе, чтобы данные из формы использовались для обновления сохраненного объекта(обратите внимание, что это может вызвать помехи, если несколько экземпляров формы открываются за один сеанс).Вот как это делается в Petclinic:

-

@SessionAttributes("person")
public class PersonUpdateController {
    ...

    @RequestMapping(value="/person/{personId}", method=RequestMethod.POST) 
    public String update(ModelMap modelMap, @Valid Person person, 
        BindingResult bindingResult, SessionStatus status) 
    { 
        ...
        personService.save(person);
        status.setComplete(); // Removes person from the session after successful submit
        ...
    }

    @InitBinder
    public void setAllowedFields(WebDataBinder dataBinder) {
        dataBinder.setDisallowedFields("id"); // For security
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...