Domanda

Sto lavorando con Spring MVC e mi piacerebbe che associare un un oggetto persistente dal database, ma non riesco a capire come posso impostare il mio codice per effettuare una chiamata al DB prima di vincolante. Per esempio, io sto cercando di aggiornare un oggetto "BenefitType" per il database, però, voglio che per ottenere il database degli oggetti fromthe, non crearne uno nuovo in modo da non dover aggiornare tutti i campi.

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

Soluzione 2

Così ho finito per risolvere questo annotando un metodo con un @ModelAttribute con lo stesso nome della classe. Primavera costruisce il primo modello prima di eseguire la mappatura di richiesta:

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

Altri suggerimenti

Ci sono diverse opzioni:

  • Nel caso più semplice, quando l'oggetto ha proprietà solo semplici si può legare tutte le sue proprietà ai campi del modulo (hidden se necessario), e ottenere un oggetto completamente rilegato dopo presentare. proprietà complesse possono anche essere legati ai campi del modulo utilizzando PropertyEditors.

  • Si può anche utilizzare la sessione per memorizzare l'oggetto tra le richieste GET e POST. Spring 3 dell'operatore facilitano questo approccio con @SessionAttributes annotazione (dal Petclinic esempio ):

    @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();
            }
        }
    }
    

    Tuttavia questo approccio può causare problemi se diverse istanze del form sono aperte contemporaneamente nella stessa sessione.

  • Quindi, l'approccio più affidabile per i casi complessi è quello di creare un oggetto separato per la memorizzazione di campi modulo e modifiche di unione da detto oggetto in oggetto permanente manualmente.

Anche se è possibile che il modello di dominio è così semplice che è possibile associare UI oggetti direttamente a oggetti del modello di dati, è più probabile che questo non è così, in questo caso vi consiglio vivamente a progettare una classe appositamente per la forma legame, quindi tradurre tra esso e gli oggetti di dominio nel controller.

Sono un po 'confuso. Penso che si sta effettivamente parlando di un flusso di lavoro di aggiornamento?

Hai bisogno di due @RequestMappings, uno per GET e una per POST:

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

poi sul POST realmente aggiornare il campo.

In te Nell'esempio precedente, il vostro @ModelAttribute dovrebbe già essere popolato con un metodo come metodo di cui sopra, e le proprietà di essere vincolato usando qualcosa come JSTL o in primavera tabglibs in concomitanza con l'oggetto form supporto.

Si potrebbe anche voler guardare InitBinder a seconda del caso d'uso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top