2011-10-18 12 views
7

Necesito crear un aspecto que me resulta difícil de describir, por lo que permítanme señalar las ideas:pointcut primavera AOP con un argumento cierto

  • cualquier método dentro del paquete (o cualquier subpaquete) del com. xy ..
  • un argumento método es una implementación de una interfaz javax.portlet.PortletRequest
  • es posible que me más argumentos en el método
  • pueden estar en cualquier orden

necesito un punto de corte y un consejo "en torno" a la PortletRequest dado

Actualmente tengo SMT como:

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


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

y recibo un error:

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]

Cualquier ayuda muy apreciada

Saludos cordiales, Dan

ACTUALIZACIÓN el método que estoy tratando de interceptar es:

en clase pública com.xyMainClass:

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

en clase pública com.xyasd.HelpClass :

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

De cource, quiero obtener el argumento que implementa PortletRequest, que es RenderRequest desde el primer método, y ActionRequest desde el segundo.

Saludos, Dan

Respuesta

8

A medida que el error sugiere que necesita para utilizar el nombre completo de la PortletRequest en la expresión punto de corte - ya que es una cadena el contexto de importación no está disponible durante el tiempo de evaluación de la expresion.

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

Como ya está seleccionando el tipo en la construcción de args no necesita eso en la firma. Lo siguiente también debería funcionar.

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

Es una operación booleana y - es decir, es necesario que coincida con el patrón método, así como los args constructo.

+0

Ya no consigo el error, pero el pointcut no capta el método. Para ser más concreto, consulte la publicación actualizada anteriormente. – Queequeg

+1

Ambos métodos o solo el método mainRender. La forma en que ha definido el punto de corte solo coincidirá con aquellos métodos donde el primer parámetro es PortletRequest. Puedes probar algo como args (.., request, ..) - no estoy seguro si eso funcionaría.También puede reordenar los argumentos para que PortletRequest sea el primer argumento. – gkamal

+0

Me gustaría buscar cualquier método con una Petición de Portlet entre los parámetros, y tener acceso a esa solicitud. – Queequeg

Cuestiones relacionadas