Pregunta

Estoy trabajando con Spring MVC y me gustaría que se una a un objeto persistente de la base de datos, pero no puedo averiguar cómo puedo configurar mi código para hacer una llamada a la base de datos antes de la unión. Por ejemplo, yo estoy tratando de actualizar un objeto "BenefitType" a la base de datos, sin embargo, yo quiero que esté la base de datos de objetos fromthe, no crear uno nuevo, así que no tengo que actualizar todos los campos.

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

Solución 2

Así que terminé resolver esto mediante la anotación de un método con un @ModelAttribute del mismo nombre de la clase. Primavera construye el modelo primero antes de ejecutar la asignación de solicitud:

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

Otros consejos

Hay varias opciones:

  • En el caso más simple cuando el objeto tiene propiedades sólo 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 someterse. propiedades complejos también se pueden unir a los campos de formulario utilizando PropertyEditors.

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

    @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 método más fiable para los casos complejos es crear un objeto separado para almacenar los campos de formulario y los cambios de combinación de ese objeto en objeto persistente manualmente.

Si bien es posible que su modelo de dominio es tan simple que puede enlazar IU objetos directamente a los objetos del modelo de datos, es más probable que esto no es así, en cuyo caso yo recomendaría a diseñar una clase específica para la forma La unión, luego traducir entre él y los objetos de dominio en su controlador.

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

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

@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 actualizar realmente el campo.

En usted ejemplo anterior, su @ModelAttribute ya debería estar rellena con un método como el método anterior, y las propiedades obligarse usando algo como JSTL o primavera tabglibs en conjunción con el objeto de formulario de soporte.

También es posible que desee ver en InitBinder dependiendo de su caso de uso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top