2011-10-18 20 views
7

tôi cần phải tạo ra một khía cạnh mà tôi tìm thấy khó tả, vì vậy hãy để tôi chỉ ra những ý tưởng:Spring AOP pointcut với một đối số nào đó

  • bất kỳ phương pháp trong gói (hoặc bất kỳ gói con) của com. xy ..
  • một phương pháp luận là một thực hiện một giao diện javax.portlet.PortletRequest
  • có thể cho tôi nhiều đối số trong phương pháp
  • họ có thể ở bất kỳ thứ tự

Tôi cần một pointcut và một "xung quanh" Lời khuyên với PortletRequest cho

Hiện nay tôi có SMT như:

@Pointcut("execution(* com.x.y..*.*(PortletRequest,..)) && args(request,..)") 
public void thePointcut(PortletRequest request) { 
} 


@Around("thePointcut(request)") 
    public Object theAdvice(ProceedingJoinPoint joinPoint, PortletRequest request) { 
... 

và nhận được một lỗi:

ERROR 10:47:27.159 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] o.s.web.portlet.DispatcherPortlet - Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet. mvc.HttpRequestHandlerAdapter': Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: w arning no match for this type name: PortletRequest [Xlint:invalidAbsoluteTypeName]

Bất kỳ trợ giúp đánh giá cao

Trân trọng, Dan

CẬP NHẬT phương pháp tôi đang cố gắng để đánh chặn là:

trong public class com.xyMainClass:

public String mainRender(Model model, RenderRequest request) throws SystemException

trong public class com.xyasd.HelpClass :

public final void helpAction(ActionRequest request, ActionResponse response, Model model)

Của cource, tôi muốn có được đối số thực hiện PortletRequest, đó là RenderRequest từ phương thức đầu tiên và ActionRequest từ phương thức thứ hai.

Kính trọng, Dan

Trả lời

8

Khi lỗi cho thấy bạn cần phải sử dụng tên đầy đủ của PortletRequest trong biểu thức điểm cắt - vì nó là một chuỗi bối cảnh nhập khẩu không có sẵn trong thời gian thẩm định cách diễn đạt.

@Pointcut("execution(* com.x.y..*.*(javax.portlet.PortletRequest.PortletRequest,..)) && args(request,..)") 
public void thePointcut(PortletRequest request) { 
} 

Vì bạn đã chọn loại trong cấu trúc args bạn không cần nó trong chữ ký. Sau đây cũng nên làm việc.

@Pointcut("execution(* com.x.y..*.*(..)) && args(request,..)") 
public void thePointcut(PortletRequest request) { 
} 

Đây là thao tác boolean - nghĩa là cần phải khớp với mẫu phương thức cũng như cấu trúc arg.

+0

Tôi không nhận được lỗi nữa, nhưng phím tắt không bắt được phương pháp. Để cụ thể hơn, vui lòng kiểm tra bài đăng cập nhật ở trên. – Queequeg

+1

Cả hai phương pháp hoặc chỉ có phương pháp mainRender. Cách bạn đã xác định điểm cắt nó sẽ chỉ phù hợp với những phương thức mà tham số đầu tiên là PortletRequest. Bạn có thể thử một cái gì đó như args (.., yêu cầu, ..) - không chắc chắn nếu điều đó sẽ làm việc.Bạn cũng có thể sắp xếp lại các đối số để có PortletRequest làm đối số đầu tiên. – gkamal

+0

Tôi muốn bắt bất kỳ phương thức nào với một PortletRequest giữa các tham số và có quyền truy cập vào yêu cầu đó. – Queequeg

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