2011-09-03 17 views
5

Tôi có Trình xử lý ngăn chặn mùa xuân chặn URL của giao diện người dùng trong ứng dụng của tôi (/ app/*). Tôi muốn xác định phương thức hành động nào trong Handler sắp được gọi từ bên trong HandlerInterceptor. Có cách nào để tìm kiếm điều đó, tôi có cần phải tiêm thứ gì đó vào máy đánh chặn có thể nhìn lên dựa trên con đường được yêu cầu không?Làm thế nào tôi có thể tra cứu phương thức đang được gọi trên một Trình xử lý từ Trình xử lý tác vụ của Spring HandlerInterceptor?

Các Interceptor là như thế này:

public class PageCacheInterceptor implements HandlerInterceptor {...} 

Nó được ánh xạ như thế này:

<mvc:interceptors> 
    <bean class="com.example.web.interceptors.PageCacheInterceptor" /> 
</mvc:interceptors> 

nền (vì tôi biết bạn sẽ hỏi!). Tôi đang thêm bộ nhớ đệm trang đơn giản vào ứng dụng của mình và muốn sử dụng chú thích như @Cacheable trên mỗi phương thức phù hợp trong bộ điều khiển. Sau đó, trình chặn có thể xác định xem có nên lưu lại một phản hồi dựa trên hành động tạo ra nó hay không.

Ví dụ:

@RequestMapping(value = "", method = RequestMethod.GET) 
@Cacheable(events={Events.NEW_ORDER,Events.NEW_STAT}) 
public String home(Model model) {...} 

Các sự kiện là những người gây ra bộ nhớ cache để không còn giá trị. Ví dụ/widget/danh sách hành động sẽ có phản hồi được lưu trữ của nó bị vô hiệu hóa bởi một widget mới đang được lưu.

Chỉnh sửa: Tôi đã nâng cấp lên Spring 3.1 M2 mới nhất, như this blog post gợi ý các tính năng tôi cần, nhưng không rõ liệu việc tiêm các lớp mới hay phân lớp chúng sẽ được yêu cầu. Có ai sử dụng chúng để lấy lại HandlerMethod trong một máy đánh chặn không?

+1

Ok tôi figured this out. Tuy nhiên ... 'Người dùng có ít hơn 100 danh tiếng không thể trả lời câu hỏi của riêng mình trong 8 giờ' - vì vậy nếu bạn đang ở trên cạnh ghế ngồi chờ giải pháp, hãy kiên nhẫn ... –

Trả lời

7

Ok vì vậy giải pháp đã thực sự thực sự dễ dàng:

1) Nâng cấp lên mùa xuân 3,1

2) RTFM (đúng)

Ví dụ một HandlerInterceptor thể cast xử lý từ Object để HandlerMethod và nhận quyền truy cập vào phương pháp điều khiển đích, chú thích của nó, v.v.

3) Truyền tay cầm r đối tượng để HandlerMethod trong Interceptor.

Sau đó, bạn có thể làm điều này loại:

HandlerMethod method = (HandlerMethod) handler; 
    Cacheable methodAnnotation = method.getMethodAnnotation(Cacheable.class); 
    if (methodAnnotation != null) { 
     System.out.println("cacheable request"); 
    } 
0
@Override 
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
System.out.println("Pre-handle"); 
HandlerMethod hm=(HandlerMethod)handler; 
Method method=hm.getMethod(); if(method.getDeclaringClass().isAnnotationPresent(Controller.class)){ 
if(method.isAnnotationPresent(ApplicationAudit.class)) 
{ 
System.out.println(method.getAnnotation(ApplicationAudit.class).value()); 
request.setAttribute("STARTTIME",System.currentTimemillis()); 
} 
} 
return true; 
} 

bài này có thêm chi tiết, hy vọng điều này sẽ giúp http://www.myjavarecipes.com/spring-profilingaudit-using-mvc-filters/

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