2011-10-18 15 views
7

ho bisogno di creare un aspetto che trovo difficile da descrivere, quindi vorrei sottolineare le idee:Spring AOP pointcut con un certo argomento

  • qualsiasi metodo all'interno del pacchetto (o qualsiasi sottopackage) di com. xy ..
  • un metodo argomento è un'implementazione di un'interfaccia javax.portlet.PortletRequest
  • ci sia qualcuno che mi più argomenti nel metodo
  • essi possono essere in qualsiasi ordine

ho bisogno di un pointcut e di un "giro" consiglio con la PortletRequest data

Attualmente ho SMT come:

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


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

e ricevo un errore:

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]

Qualsiasi aiuto molto apprezzato

Cordiali saluti, Dan

UPDATE il metodo che sto cercando di intercettare è:

in public class com.xyMainClass:

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

in public class com.xyasd.HelpClass :

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

Di cource, voglio ottenere l'argomento che implementa PortletRequest, ovvero RenderRequest dal primo metodo e ActionRequest dal secondo.

saluti, Dan

risposta

8

Come l'errore suggerisce è necessario utilizzare il nome completo del PortletRequest nell'espressione punto di taglio - in quanto si tratta di una stringa di contesto di importazione non è disponibile durante il periodo di valutazione di l'espressione.

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

Poiché si sta già selezionando il tipo nel costrutto args, non è necessario nella firma. Anche il seguente dovrebbe funzionare.

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

E è un'operazione booleana - cioè, essa deve corrispondere al modello metodo, nonché i args costruiscono.

+0

Non riesco più a ottenere l'errore, ma il collegamento non rileva il metodo. Per essere più concreto, si prega di controllare il post aggiornato sopra. – Queequeg

+1

Entrambi i metodi o solo il metodo mainRender. Il modo in cui hai definito il punto di taglio corrisponderà solo a quei metodi in cui il primo parametro è PortletRequest. Puoi provare qualcosa come args (.., request, ..) - non so se funzionerebbe.È inoltre possibile riordinare gli argomenti in modo da avere PortletRequest come primo argomento. – gkamal

+0

Mi piacerebbe prendere qualsiasi metodo con un PortletRequest tra i parametri e avere accesso a quella richiesta. – Queequeg

Problemi correlati