Aop Аннотация на Spring Controllers не работает - PullRequest
3 голосов
/ 23 ноября 2011

Я сделал аннотацию для AOP. Когда я использую его в любом методе, а не в контроллере, он работает хорошо. Однако, когда я использую его в методах моего контроллера, мой контроллер перестает работать. Начинает выдавать 404 не найденную ошибку для отображений. Я нашел похожий вопрос здесь: Spring 3 MVC @ Controller с перехватчиками AOP? но я не знаю, как это сделать. Мой метод в моем контроллере таков:

@WebAuditable // This is my annotation that works at other methods
@Override
@RequestMapping(value = "/ad", method = RequestMethod.POST, headers = "Accept=application/json")
public
@ResponseBody
Cd create(HttpServletResponse response, @RequestBody Cd cd) {
    ...
}

Мой интерфейс, который реализует мой контроллер, таков:

public interface BaseController<T> {

    public List<T> getAll(HttpServletResponse response);

    public T getByName(HttpServletResponse response, String id);

    public T create(HttpServletResponse response, T t);

    public T update(HttpServletResponse response, T t);

}

Любые советы?

PS: @SeanPatrickFloyd говорит, что:

Примечание. При использовании интерфейсов контроллера (например, для проксирования AOP), сделайте Обязательно последовательно размещайте все свои картографические аннотации - такие как @RequestMapping и @SessionAttributes - на интерфейсе контроллера а не на классе реализации

1 Ответ

4 голосов
/ 23 ноября 2011

Дело в том, что сопоставление контроллера выполняется во время выполнения, и если вы используете прокси-серверы AOP, прокси-объекты не имеют аннотаций во время выполнения, только их интерфейсы.Я могу придумать две возможные стратегии, чтобы обойти это ограничение.

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

Другим способом было бы переключиться на прокси CGLib с использованием прокси-сервера.целевой класс = «истина».Таким образом прокси-классы должны (я не уверен в этом) сохранять аннотации.

Обновление: аннотирование вашего интерфейса должно работать следующим образом (если он работает)

public interface BaseController<T> {

    @WebAuditable
    public List<T> getAll(HttpServletResponse response);

    @WebAuditable
    public T getByName(HttpServletResponse response, String id);

    @WebAuditable
    public T create(HttpServletResponse response, T t);

    @WebAuditable
    public T update(HttpServletResponse response, T t);

}

Аннотированиебазовый класс не будет работать, потому что прокси-серверы JDK не предоставляют никакой информации, которая не поддерживается интерфейсами.

...