2013-06-27 1 views
0

Я пытаюсь перехватить метод интерфейса, записанный с помощью JAX-RS @POST. Мой Pointcut работает для всех не-интерфейсных методов, и если @ POST-Annotation находится непосредственно в вызываемом методе.AspectJ Pointcut вызов JAX-RS аннотированного метода интерфейса

Метод интерфейса для перехвата:

@POST 
Response postToConnector(@Context CallContext callContext, String contentStream) throws Exception; 

Pointcut в соответствии с методом:

@Pointcut("call(@(javax.ws.rs.DELETE || javax.ws.rs.GET || javax.ws.rs.HEAD || javax.ws.rs.OPTIONS || " 
    + "javax.ws.rs.POST || javax.ws.rs.PUT) public * org.myapp..webapi..*(..))") 
public void anyPublicWebApiPointcut() 
{ 
... 
} 

интерфейс находится внутри пакета com.myapp.social.webapi.v1 и даже если я измените метод на public AspectJ не перехватит вызов.

Есть ли что-нибудь изменить в моем пункте Pointcut? Как я могу заставить это работать?

+0

Я знаю, что этот старый, но все еще указан как неотвеченный. Не могли бы вы согласиться и перенести мой ответ, если это будет уместно? Благодарю. – kriegaex

ответ

0

Что такое call() pointcut does is, как следует из названия, перехватывает вызовы на определенный метод/конструктор. Чтобы это работало, вызывающий (то есть фрагмент кода, где расположен вызов), должен находиться под вашим контролем, т. Е. Он должен быть сплетен. Так, если, например, вы соткали классы org.myapp..webapi..*, и звонок также был выпущен оттуда, он должен работать. То, что это не работает, заставляет меня предположить, что вызовы POST происходят откуда-то вне сплетенного кода, например. JRE или сторонней библиотеки.

Так что если org.myapp..webapi..* находится под вашим контролем, то есть вы можете вставить в него код аспекта, вы должны использовать pointcut execution(). В отличие от call(), он вплетен в вызываемый, то есть в код, где определяется метод, а не во многие места, где он вызывается. Таким образом, вы можете перехватывать все методы исполнения, независимо от того, поступают они из вашего приложения или стороннего или JRE-кода. Это будет даже работать для выполнения методов, вызванных отражением.

call() и execution() имеют принципиально разные семантики, которые окупаются, чтобы узнать и понять. Как правило, вы должны стараться использовать execution(), когда это возможно, т. Е. Всякий раз, когда вызываемый человек является вам доступным. call() - это просто ваше падение, если вы не можете переплетаться в вызываемом и использовать вызывающего. call() также может иметь смысл, если по какой-то причине вам необходимо принимать какие-либо решения на основе контекста соединения, например. в совете around(), который решает позвонить или не вызывать исходный метод на основе некоторого условия.