2010-09-08 12 views
5

Pracuję z Spring MVC i chciałbym, żeby powiązał trwały obiekt z bazy danych, ale nie wiem, w jaki sposób mogę ustawić mój kod wywołanie do DB przed powiązaniem. Na przykład próbuję zaktualizować obiekt "BenefitType" do bazy danych, jednak chcę, aby obiekt został pobrany z bazy danych, a nie utworzyć nowy, więc nie muszę aktualizować wszystkich pól.Spring MVC 3.0: Jak powiązać z trwałym obiektem

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

Odpowiedz

4

Rozwiązałem to, opisując metodę z atrybutem @ModelAttribute o tej samej nazwie w klasie. Spring buduje model najpierw przed wykonaniem mapowania żądań:

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

Chociaż możliwe jest, że dany model domeny jest tak proste, że można powiązać UI obiektów bezpośrednio do modelu danych przedmiotów, to jest bardziej prawdopodobne, że tak nie jest, w tym przypadku bardzo polecam Ci zaprojektować klasy specjalnie dla wiązania formularza, a następnie przetłumaczyć między nim a obiektami domeny w kontrolerze.

0

Jestem trochę zdezorientowany. Myślę, że faktycznie mówisz o przepływie pracy aktualizacji?

Potrzebne są dwa @RequestMappings, jeden dla GET i jeden dla postu:

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

następnie na stanowisku faktycznie aktualizacji pola.

W powyższym przykładzie twój @ModelAttribute powinien już być wypełniony metodą podobną do powyższej metody, a właściwości należy związać przy użyciu czegoś takiego jak JSTL lub Spring tabglibs w połączeniu z obiektem do tworzenia formularzy.

Możesz również sprawdzić numer InitBinder w zależności od przypadku użycia.

3

Istnieje kilka opcji:

  • W simpliest przypadku, gdy obiekt posiada tylko proste właściwości można powiązać wszystkie swoje właściwości do pól formularza (hidden jeśli to konieczne), a otrzymasz całkowicie związanego obiektu po Zatwierdź. Złożone właściwości można również powiązać z polami formularza za pomocą PropertyEditor s.

  • Możesz również użyć sesji do przechowywania obiektu między żądaniami GET i POST. Spring 3 faciliates tym podejściu @SessionAttributes adnotacją (z 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(); 
         } 
        } 
    } 
    

    Jednak podejście to może powodować problemy, jeśli kilka przypadków postaci otwartych jednocześnie w tej samej sesji.

  • Najbardziej wiarygodnym podejściem do złożonych przypadków jest utworzenie osobnego obiektu do przechowywania pól formularzy i ręcznego scalania zmian z tego obiektu w obiekt stały.

+0

Poszedłem tą ścieżką, ale wolałbym nie używać tej sesji. –

Powiązane problemy