2011-09-12 14 views
5

Tôi có bộ điều khiển có phương thức xử lý dữ liệu đến GET, lưu trữ một số thứ trong model và sau đó chuyển hướng đến một trang khác có liên quan đến các đối tượng này.Làm thế nào tôi có thể lấy một đối tượng ra khỏi mô hình trong bộ điều khiển với Spring MVC 3?

Tôi dường như không tìm được cách tốt để đưa đối tượng được lưu trữ trong phương thức đầu tiên ra khỏi mô hình để sử dụng theo phương pháp thứ hai. Tôi có thể làm cái này như thế nào?

Dưới đây là top của bộ điều khiển:

@Controller 
@RequestMapping("/reviews") 
@SessionAttributes({"review", "externalReview"}) 
public class ReviewController { 
    // [SNIP] 
} 

Dưới đây là đoạn code mà bổ sung thêm các đối tượng tôi là sau khi để mô hình:

@RequestMapping(value="/new", params="UName", method=RequestMethod.GET) 
public String newFormFromExternal(@ModelAttribute("externalReview") ExternalReview externalReview, Model model) throws IncompleteExternalException { 
    // Convert the inbound external 
    Review fromExternal = ExternalReviewUtil.reviewFromExternalReview(externalReview, externalDAO); 

    // Add the externalReview to the session so we can look to see if we got a reviewee on the way in 
    model.addAttribute("externalReview", externalReview); 

    model.addAttribute("review", fromExternal); 

    return "redirect:/reviews/newFromExternal"; 
} 

Trả lời

2

Bạn là người may mắn.

Nếu bạn đang sử dụng hoặc có khả năng cập nhật mới được phát hành Xuân 3.1, bạn có thể tận dụng các mới scoped flash biến.

http://static.springsource.org/spring/docs/3.1.0.RC1/spring-framework-reference/html/mvc.html#mvc-flash-attributes

Nếu bạn không thể sử dụng 3.1, bạn có thể có thể thực hiện các giải pháp cho mình. Về cơ bản, bạn muốn nắm bắt đối tượng mô hình được yêu cầu để có mặt trong chuyển hướng, đặt trong phiên và loại bỏ nó sau khi nó được truy lục để giữ cho phiên của bạn khỏi bị bloating.

1

Hiện nay, tôi chỉ nhận được một Map của mô hình, nhận được đối tượng tôi muốn bằng phím của nó (tên String), và sau đó đúc nó vào đối tượng nó thực sự là (chứ không phải chỉ là Object).

Dưới đây là các mã:

@RequestMapping(value="/newFromExternal", method=RequestMethod.GET) 
public String newExternalForm(Model model) { 
    // Get the review from the model 
    Review review = (Review) model.asMap().get("review"); 

    /*** Do stuff with the review from the model ****/ 

    return "reviews/newFromPacs"; 
} 

Bằng cách này hoạt động, nhưng có vẻ như hacky và thô. Đây có phải là cách duy nhất không?

+0

'đánh giá' được khai báo trong' @ SessionAttributes', đúng không? – axtavt

+0

@axtavt - Có, tôi đã chỉnh sửa câu hỏi để hiển thị định nghĩa lớp điều khiển. – cdeszaq

1

Một giải pháp khả thi là sử dụng @ModelAttribute, mặc dù nó khá xấu xí vì bạn sẽ cần phải tắt databinding cho thuộc tính đó (đối với an ninh):

@RequestMapping(value="/newFromExternal", method=RequestMethod.GET) 
public String newExternalForm(@ModelAttribute Review review) { 
    ... 
} 

@InitBinder("review") 
public void disableReviewBinding(WebDataBinder b) { 
    b.setAllowedFields(); 
} 
+0

Thật không may, việc vô hiệu hóa ràng buộc dữ liệu trên thuộc tính đó sẽ trở nên tồi tệ vì tôi cần người dùng điền dữ liệu bị thiếu (đó là phương thức thứ 2 có liên quan), vì vậy ràng buộc nó trong phương thức 'POST' sau đó là luồng hiện tại. Tuy nhiên, đó là sạch hơn (trên một số cấp độ) so với những gì tôi hiện có. – cdeszaq

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