2010-09-08 17 views
5

Estoy trabajando con Spring MVC y me gustaría vincular un objeto persistente de la base de datos, pero no puedo entender cómo puedo configurar mi código para hacer una llamada al DB antes del enlace. Por ejemplo, estoy tratando de actualizar un objeto "BenefitType" a la base de datos, sin embargo, quiero que obtenga el objeto de la base de datos, no crear uno nuevo, así que no tengo que actualizar todos los campos.Spring MVC 3.0: ¿Cómo puedo enlazar a un objeto persistente?

@RequestMapping("/save") 
public String save(@ModelAttribute("item") BenefitType benefitType, BindingResult result) 
{ 
    ...check for errors 
    ...save, etc. 
} 

Respuesta

4

Así que terminé resolviendo esto mediante la anotación de un método con @ModelAttribute del mismo nombre en la clase. Spring crea el modelo primero antes de ejecutar el mapeo de solicitud:

@ModelAttribute("item") 
BenefitType getBenefitType(@RequestParam("id") String id) { 
    // return benefit type 
} 
0

Si bien es posible que su modelo de dominio es tan simple que puede enlazar IU se opone directamente a los objetos del modelo de datos, es más probable que esto no es así, en cuyo caso Recomiendo encarecidamente que diseñar una clase específicamente para el enlace de formulario, luego traduzca entre él y los objetos de dominio en su controlador.

0

Estoy un poco confundido. Creo que en realidad estás hablando de un flujo de trabajo de actualización.

Se necesitan dos @RequestMappings, uno por uno para GET y POST:

@RequestMapping(value="/update/{id}", method=RequestMethod.GET) 
public String getSave(ModelMap model, @PathVariable Long id) 
{ 
    model.putAttribute("item", benefitDao.findById(id)); 
    return "view"; 
} 

a continuación en el poste de realidad actualizar el campo.

En su ejemplo anterior, su @ModelAttribute ya debería completarse con un método como el método anterior, y las propiedades se vincularán usando algo como JSTL o Spring tabglibs junto con el objeto de respaldo de formulario.

Es posible que también desee consultar InitBinder dependiendo de su caso de uso.

3

hay varias opciones:

  • En el caso más simple cuando el objeto tiene sólo propiedades simples que puede unir todas sus propiedades a los campos de formulario (hidden si es necesario), y obtener un objeto totalmente consolidados después de enviar. Las propiedades complejas también pueden vincularse a los campos de formulario usando PropertyEditor s.

  • También puede utilizar la sesión para almacenar su objeto entre GET y POST solicitudes. Spring 3 faciliates este enfoque con @SessionAttributes anotación (de la Petclinic sample):

    @Controller 
    @RequestMapping("/owners/*/pets/{petId}/edit") 
    @SessionAttributes("pet") // Specify attributes to be stored in the session  
    public class EditPetForm {  
        ... 
        @InitBinder 
        public void setAllowedFields(WebDataBinder dataBinder) { 
         // Disallow binding of sensitive fields - user can't override 
         // values from the session 
         dataBinder.setDisallowedFields("id"); 
        } 
        @RequestMapping(method = RequestMethod.GET) 
        public String setupForm(@PathVariable("petId") int petId, Model model) { 
         Pet pet = this.clinic.loadPet(petId); 
         model.addAttribute("pet", pet); // Put attribute into session 
         return "pets/form"; 
        } 
        @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); 
          // Clean the session attribute after successful submit 
          status.setComplete(); 
          return "redirect:/owners/" + pet.getOwner().getId(); 
         } 
        } 
    } 
    

    Sin embargo, este enfoque puede causar problemas si varios casos de la forma están abiertos de forma simultánea en la misma sesión.

  • Por lo tanto, el enfoque más confiable para los casos complejos es crear un objeto separado para almacenar campos de formulario y fusionar manualmente los cambios de ese objeto a objeto persistente.

+0

Fui por este camino, pero preferiría no utilizar la sesión. –

Cuestiones relacionadas