Spring, Aspect J, несколько советов AfterThrowing, примененных к одному и тому же pointcut - PullRequest
0 голосов
/ 09 декабря 2010

Можно ли применить два совета AfterThrows к одному и тому же pointcut, ограниченному конкретным типом исключения, где одно исключение является суперклассом другого, а в случае захвата подкласса выполняется только один совет?

Я хочу перевести исключения во время выполнения (как пользовательские, так и стандартные), исключаемые из уровня обслуживания, где в некоторых случаях я делаю определенный перевод, а затем получаю фрагмент типа "ловить все" совет перевести что-нибудь действительно неожиданное:

@AfterThrowing(pointcut = "execution(* com.my.company.api.*(..))", throwing = "rnfex")
public void doTranslationAction(ResourceNotFoundException rnfex) {
   // throw new WebApplicationException with Status.NOT_FOUND;
}

@AfterThrowing(pointcut = "execution(* com.my.company.api.*(..))", throwing = "aex")
public void doTranslationAction(AuthorisationException aex) {
   // throw new WebApplicationException with Status.NOT_AUTHORISED;
}

@AfterThrowing(pointcut = "execution(* com.my.company.api.*(..))", throwing = "throwable")
public void doTranslationAction(Throwable throwable) {
   // Log something here about this unexpected exception
   // throw new WebApplicationException with Status.INTERNAL_SERVER_ERROR
}

Я обнаружил, что в этом случае, если я выбрасываю исключение, которое явно обрабатывается, то вызывается правильный метод, генерируется переведенное исключение, которое затем захватывается более широким советом «Throwable», а затем снова переводится в всеобъемлющий INTERNAL_SERVER_ERROR WAE. Это не неожиданно, но просто не совсем то, что я искал.

Чтобы обойти это, у меня есть один совет, который собирает все типы Throwable и затем использует instanceof, чтобы решить, является ли это ожидаемым пользовательским исключением времени выполнения, которое я могу перевести в конкретный WAE или нет.

Если я когда-либо увижу «instanceof», я уверен, что сделал что-то, за что стыдно, но я не уверен, есть ли лучший способ решить эту проблему без него?

Я также против преобразования ожидаемых пользовательских исключений в проверенные исключения и последующего перехвата исключения времени выполнения в качестве перехвата всех, что может быть одним из решений.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2011

я не совсем уверен ... но мне просто интересно, можно ли написать ваш последний (третий) совет следующим образом

execution( * com.my.company.api..*(..)) and !execution( * com.my.company.api.XyzAspect..*(..))
public void doTranslationAction(Throwable throwable) {
   // Log something here about this unexpected exception
   // throw new WebApplicationException with Status.INTERNAL_SERVER_ERROR
}

где XyzAspect.java - класс @Aspect, в котором вы пишете эти 3 совета.

0 голосов
/ 13 декабря 2010

Я написал аналогичный аспект некоторое время назад, и в итоге я использовал "instance of". Я не думаю, что есть проблема с этим.

...