Проблемы с автоматическим прокси AspectJ с Spring Controllers и действиями Webflow
У меня есть два связанных вопроса относительно весны /AspectJ AOP. У меня есть типичный аспект ведения журнала, который регистрирует исключения, генерируемые из любого класса в моем приложении, включая сервисы, daos, контроллеры и действия веб-потока...
@Aspect
public class AspectLogger {
@AfterThrowing(pointcut = "execution(* com.myapp..*.*(..))", throwing = "t")
public void logGustavoException(JoinPoint joinPoint, Throwable t) {
Log logger = LogFactory.getLog(joinPoint.getTarget().getClass());
logger.error(t.getMessage(), t);
}
}
В контексте моего приложения у меня одинаково типичная конфигурация...
<context:annotation-config />
<!-- AOP logging config -->
<aop:aspectj-autoproxy>
<aop:include name="aspectLogger" />
</aop:aspectj-autoproxy>
<bean id="aspectLogger" class="com.myapp.AspectLogger" />
По большей части это работает нормально, проблема, с которой я сталкиваюсь, связана с действиями и контроллерами веб-потока, которые реализуют интерфейс.
1 - Контроллеры, которые реализуют интерфейс...
Один из наших контроллеров реализует интерфейс, который определяет один метод, а также определяет несколько открытых методов, которые используются в качестве обработчиков @RequestMapping...
@Controller
public class AmazingController implements OutstandingInterface {
// implements the method from OutstandingInterface
@Override
public Object doSomethingOutstanding(){
...
}
@RequestMapping(value="/amazingUrl.htm", method = RequestMethod.GET)
public String doSomethingAmazing(HttpSession session, ModelMap model) {
return "anAmazingViewName";
}
...
}
Проблема заключается в том, что из-за того, что контроллер реализует интерфейс, который не определяет все его общедоступные методы (то есть методы сопоставления запросов контроллера), для контроллера создается прокси, который только проксирует метод doSomethingOutstanding из OutstandingInterface. Таким образом, когда запрос поступает в /amazingUrl.htm, Spring не направляет его соответствующему обработчику запросов - это как если бы отображение запроса не существовало. Я решил эту проблему, определив интерфейс для контроллера, который расширяет OutstandingInterface, а также определяет методы обработчика запросов, требуемые контроллером, но мне кажется странным / неправильным определять интерфейс для контроллера просто так, чтобы материал AspectJ не 'скрыть' обработчик запроса...
@Controller
public interface IAmazingController extends OutstandingInterface{
@RequestMapping(value="/amazingUrl.htm", method = RequestMethod.GET)
public String doSomethingAmazing(HttpSession session, ModelMap model);
}
...
public class AmazingController implements IAmazingController {
@Override
public Object doSomethingOutstanding(){
...
}
@Override
@RequestMapping(value="/amazingUrl.htm", method = RequestMethod.GET)
public String doSomethingAmazing(HttpSession session, ModelMap model) {
return "anAmazingViewName";
}
...
}
2 - Действия веб-потока
Второй вопрос очень похож. После введения конфигурации AspectJ ни один из моих классов Action веб-потока не был правильно подключен автоматически - я продолжал получать сообщения типа "не могу найти компонент типа FantasticAction". Опять же, я представил интерфейсы для всех классов Action, и это решило проблему, поскольку во время выполнения внедрялся прокси-сервер, а не реальный класс реализации действия.
Итак, наконец... вопрос в обоих случаях: есть ли способ обойти эти проблемы AspectJ без необходимости определять интерфейсы для каждого класса, который я хочу посоветовать?
1 ответ
Вы должны добавить CGLIB зависимую в ваш путь к классу, чтобы вам не нужно было создавать интерфейсы для работы с AOP
Посмотрите на док.