Spring MVC 3.0: Come posso associare a un oggetto persistente
-
01-10-2019 - |
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.
}
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 utilizzandoPropertyEditor
s. -
Si può anche utilizzare la sessione per memorizzare l'oggetto tra le richieste
GET
ePOST
. 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.