2010-09-08 43 views
5

Tôi đang làm việc với Spring MVC và tôi muốn nó liên kết một đối tượng liên tục từ cơ sở dữ liệu, nhưng tôi không thể tìm ra cách tôi có thể đặt mã của mình một cuộc gọi đến DB trước khi ràng buộc. Ví dụ, tôi đang cố gắng cập nhật một đối tượng "BenefitType" vào cơ sở dữ liệu, tuy nhiên, tôi muốn nó lấy đối tượng từ cơ sở dữ liệu, không tạo một đối tượng mới vì vậy tôi không phải cập nhật tất cả các trường.Spring MVC 3.0: Làm cách nào để liên kết với đối tượng liên tục

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

Trả lời

4

Vì vậy, tôi đã giải quyết vấn đề này bằng cách chú thích một phương thức có @ModelAttribute cùng tên trong lớp. Spring xây dựng mô hình đầu tiên trước khi thực hiện ánh xạ yêu cầu:

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

Mặc dù có thể mô hình miền của bạn đơn giản đến nỗi bạn có thể ràng buộc đối tượng giao diện người dùng trực tiếp với đối tượng mô hình dữ liệu, trong trường hợp này tôi khuyên bạn nên thiết kế lớp đặc biệt cho ràng buộc biểu mẫu, sau đó dịch giữa nó và các đối tượng miền trong bộ điều khiển của bạn.

0

Tôi hơi bối rối. Tôi nghĩ rằng bạn đang thực sự nói về một công việc cập nhật?

Bạn cần hai @RequestMappings, một cho GET và một cho POST:

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

sau đó trên POST thực sự cập nhật lĩnh vực này.

Trong ví dụ trên, @ModelAttribute của bạn phải được điền bằng phương pháp như phương pháp trên và các thuộc tính bị ràng buộc bằng cách sử dụng thứ gì đó như thẻ JSTL hoặc Spring cùng với đối tượng sao lưu biểu mẫu.

Bạn cũng có thể muốn xem InitBinder tùy thuộc vào trường hợp sử dụng của bạn.

3

Có một số lựa chọn:

  • Trong trường hợp đơn giản nhất khi đối tượng của bạn chỉ có tính chất đơn giản bạn có thể ràng buộc tất cả các thuộc tính của nó đến các trường mẫu (hidden nếu cần), và có được một đối tượng hoàn toàn bị ràng buộc sau Gửi đi. Thuộc tính phức tạp cũng có thể được liên kết với các trường biểu mẫu bằng cách sử dụng PropertyEditor s.

  • Bạn cũng có thể sử dụng phiên để lưu trữ đối tượng của mình giữa các yêu cầu GETPOST. Mùa xuân 3 faciliates phương pháp này với @SessionAttributes chú thích (từ 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(); 
         } 
        } 
    } 
    

    Tuy nhiên phương pháp này có thể gây ra vấn đề nếu một số trường hợp có dạng được mở đồng thời trong cùng một phiên. Vì vậy, cách tiếp cận đáng tin cậy nhất cho các trường hợp phức tạp là tạo ra một đối tượng riêng biệt để lưu trữ các trường biểu mẫu và hợp nhất các thay đổi từ đối tượng đó thành đối tượng liên tục theo cách thủ công.

+0

Tôi đã đi xuống con đường này, nhưng tôi thực sự không muốn sử dụng phiên. –

Các vấn đề liên quan