2010-11-07 8 views
0

J'ai une page qui a un formulaire sur lequel l'utilisateur peut enregistrer ou supprimer un bean. L'objet backing de formulaire a un bean comme sa propriété. Lorsque l'utilisateur choisit de supprimer un bean, il n'est pas nécessaire de lier le bean car JPA ne nécessite que l'id du bean à supprimer. Y a-t-il un moyen de dire au Spring MVC de ne pas lier certaines des propriétés d'un objet de support de formulaire dans certaines conditions? Je souhaite ignorer la liaison de sa propriété bean si la demande est à supprimer.Liaison sélective d'une propriété dans Spring MVC

EDIT: J'utilise Spring 3. Voici le code de psuedo.

@Controller 
public class FormController { 
    @RequestMapping(method = RequestMethod.POST) 
    public void process(HttpServletRequest request) { 
     String action = request.getParameter("action"); 

     if (action.equals("SAVE")) { 
      // bind all parameters to the bean property of the FormObject 
     } 
     else if (action.equals("DELETE")) { 
      // skip the binding. manually read the bean.id parameter. 
      int id = Integer.valueOf(request.getParameter("bean.id")); 
      EntityManager entityManager = ... 
      Bean bean = entityManager.getReference(Bean.class, id); 
      entityManager.remove(bean); 
     } 
    } 

    public class Bean { 
     private int id; 
    } 

    public class FormObject { 
     private Bean bean; 
    } 
} 
+0

donner: version de printemps, et exemple de code – Bozho

Répondre

4

Vous pouvez distinguer entre les différents boutons de soumission en utilisant leurs attributs name et acheminent les demandes initiées par ces boutons pour différentes méthodes de gestionnaire en utilisant les attributs de params@RequestMapping. Par exemple, au printemps 3:

<input type = "submit" name = "saveRequest" value = "Save" /> 
<input type = "submit" name = "deleteRequest" value = "Delete" /> 

.

@RequestMapping(value = "/foo", method = RequestMethod.POST, 
    params = {"saveRequest"}) 
public String saveFoo(@ModelAttribte Foo foo, BindingResult result) { ... } 

// Only "id" field is bound for delete request 
@RequestMapping(value = "/foo", method = RequestMethod.POST, 
    params = {"deleteRequest"}) 
public String deleteFoo(@RequestParam("id") long id) { ... } 

Une approche plus « RESTful » serait de mettre différents boutons de soumission en différentes formes avec method = "PUT" et method = "DELETE" et de distinguer les demandes par la méthode (si elle nécessite une solution de contournement avec HiddenHttpMethodFilter).

3

Vous pouvez utiliser @InitBinder.

@InitBinder 
    public void setAllowedFields(WebDataBinder dataBinder) { 
     dataBinder.setDisallowedFields("id"); 
    } 

voir here et here.