2010-09-22 4 views
0

J'ai une demande écrite au printemps 3.0 accroché à l'aide de mise en veille prolongée à une base de données. J'ai un contrôleur à un formulaire de mise à jour. Chaque fois que le formulaire est soumis, je pense l'objet qui apparaît être mis à jour mais un nouvel objet est créé avec une nouvelle valeur d'identité. J'ai regardé l'échantillon "petclinic" et je ne peux pas voir comment c'est différent.Spring Framework - Nouvel objet est créé dans DB au lieu de la mise à jour

POJO

public class Person 
{ 
    private int id; 

    @NotNull 
    private String name; 

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

} 

Contrôleur

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 mise en œuvre

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

    //other methods 

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

Peut-on voir les lignes pertinentes de 'personService.save (personne)'? –

+0

Ajout de la méthode de sauvegarde demandée par JacobM. –

Répondre

4

Spring MVC ne fait pas de magie avec des formulaires HTML. Étant donné que votre formulaire contient un seul champ, vous obtenez un seul champ rempli dans la méthode de mise à jour. Donc, vous avez deux options:

  • Passe id comme un champ caché sous la forme: <spring:hidden path = "id" />. Notez que dans ce cas, vous devez vérifier les conséquences possibles pour la sécurité (que se passe-t-il si une personne malveillante modifie l'ID)?
  • Magasin Person dans la session afin que les données de la forme est utilisée pour mettre à jour l'objet stocké (notez qu'il peut provoquer des interférences si plusieurs instances du formulaire est ouvert en une seule séance). Voilà comment il est fait dans 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 
    } 
} 
+0

C'est exactement ce qui me manquait! Merci! –

Questions connexes