2009-06-10 28 views
8

Tôi đã cố gắng tìm câu trả lời cho câu hỏi này trên cả diễn đàn Spring và bằng cách tìm kiếm StackOverflow. Tôi đã tìm thấy rất nhiều trang mô tả kiến ​​trúc khủng khiếp và yêu cầu về điều tương tự như tôi làm, nhưng mục đích sử dụng của tôi là khác nhau, vì vậy hãy mang theo tôi :-)Truy cập HttpServletRequest từ lời khuyên AOP trong Spring 2.5 với chú thích

Tôi có một dự án Spring 2.5 sử dụng bộ điều khiển biểu mẫu dựa trên chú thích về cơ bản như thế này:

@RequestMapping("/edit/someObject") 
public String handleSubmit(HttpServletRequest request, HttpServletResponse response, SomeObject someObject, BindingResult result) { 

    // Some check here 

    if(result.hasErrors()) { 
     return "form"; 
    } else { 
     SomeObjectService.update(someObject); 
     return "redirect:/view/someObject"; 
    } 
} 

trong này tôi kiểm tra đối với một số tài sản trong http HttpServletRequest và HttpServletResponse sử dụng để gửi một chuyển hướng nếu khách sạn này có một giá trị nhất định. Kiểm tra này được thực hiện là rất nhiều (nhưng không phải tất cả) của bộ điều khiển biểu mẫu trong ứng dụng này. Những gì tôi muốn làm là tạo ra một chú thích @CheckedSubmit được xử lý bởi một số lời khuyên AOP để thực hiện việc kiểm tra này và sau đó thả các tham số HttpServletRequest và HttpServletResponse từ bộ điều khiển. Vấn đề của tôi là tôi không biết cách truy cập HttpServletRequest và HttpServletResponse hiện tại từ lời khuyên AOP này mà không sử dụng hai tham số này (không được sử dụng) cho phương thức được chú thích, đó là những gì tôi đã cố tránh ngay từ đầu.

Tóm tắt: Cách truy cập HttpServletRequest/Response từ lời khuyên AOP về phương thức chú thích @RequestMapping?

Trả lời

12

Hai giải pháp cho bản tóm tắt nhưng không phải cho toàn bộ vấn đề của bạn (hoàn toàn)

Giải pháp 1: bên tư vấn (> = Spring 2.0 yêu cầu)

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder 
     .getRequestAttributes()).getRequest(); 

Giải pháp 2: bên trong lớp khía cạnh (có thể là mùa xuân 3,0 bên trong hạt cà phê yêu cầu!)

@Autowired(required=true) 
private HttpServletRequest request; 
+0

Với nhận xét thêm rằng Solution 2 hoạt động cho các đối tượng không được khởi tạo bởi Spring khi @Configurable được sử dụng (yêu cầu AspectJ) – Tomas

3

Tôi nghĩ bạn có thể đã biết điều này, nhưng "chính thức" là làm điều này trong Spring MVS là sử dụng HandlerInterceptors. Chúng không phải là hướng chú thích, nhưng chúng được chèn vào luồng điều khiển HTTP và nhận được quyền truy cập đầy đủ vào yêu cầu và phản hồi.

+0

Vâng, tôi biết điều này. Vấn đề của tôi là điều này nên được cấu hình một chút cho mỗi phương pháp. Chú thích sẽ lý tưởng cho điều này bởi vì chúng cho phép một cách rất đơn giản để xử lý thông số bổ sung đó. – Tomas

+0

Vâng, tôi có thể thấy điều đó sẽ bị hạn chế. Một tùy chọn khác có thể là viết bản cài đặt HandlerAdapter của riêng bạn, có lẽ là phân lớp AnnotationMethodHandlerAdapter. Tôi chưa bao giờ làm điều này bản thân mình, nhưng nó có thể cung cấp cho bạn sự linh hoạt để làm những gì bạn cần. – skaffman

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