2010-06-23 12 views
8

Tengo una interfaz de servicio con muchos métodos, todos los cuales toman un objeto Request y devuelven un objeto Response. Todos los objetos de solicitud tienen un ancestro común y todos los objetos de respuesta tienen un antecesor común diferente (que tiene un indicador de éxito y un campo de mensaje).Expresión de punto de corte de Spring Aop para acceder al tipo de retorno de método

Ahora quiero tener un aspecto circular que verifique los permisos, etc., realice la llamada de servicio y devuelva un objeto de respuesta con un código de falla si algo falla. El problema es: necesito saber qué tipo de objeto de respuesta crear. ¿Hay una expresión puntual que me da acceso al tipo de devolución? Algo como esto, tal vez?

@Around(value = "execution(public *" 
    + " com.mycompany.MyService+.*(..))" 
    + " && args(request)" 
    + " && returning(returnType)" // something like this would be nice 

, argNames = "request,returnType") 
public Object handleServiceCall(final ProceedingJoinPoint pjp, 
    final Request request, 
    final Class<? extends Response> returnType){ ... } 
+0

¿Desea asesorar a varios métodos con el mismo aspecto, que a veces necesita producir y devolver el objeto de respuesta sin llamar al servicio, y ese objeto de respuesta debe ser del subtipo correcto para el método de servicio? –

+0

yup, eso es exactamente lo que quiero –

Respuesta

6

El Javadoc para JoinPoint menciona un método getSignature(), cuyo tipo Signature de retorno tiene una interfaz sub MethodSignature Puedes intentar enviar contenido a, que tiene un método getReturnType(), que podría ser lo que estás buscando.

+0

Soy consciente de esto. esta es la manera en que estoy dispuesto a ir si no existe una solución mejor, pero preferiría una expresión puntual. –

0

Se puede hacer el registro de entrada en el interior del método de asesoramiento en torno a (handleServiceCall() en su caso)

Object actuals = pjp.proceed(); 
if(actuals instanceof MyResponse){ 
//TO:DO: Your code here 
} 
+0

Lo sé, pero eso no ayudará, porque no siempre haré pjp.proceed(). Si mi aspecto decide que el usuario no tiene derecho a ejecutar la llamada de servicio, creará un objeto de respuesta directamente sin proceder. –

+0

No use '*' como 'ret-type-pattern' en la expresión de corte puntual. En su lugar, use el tipo de devolución real del método que desea interceptar. – chedine

+0

no es bueno: quiero interceptar muchos tipos de devolución diferentes, y quiero saber cuál tengo. –

Cuestiones relacionadas