Доступ к HttpServletRequest из рекомендаций AOP в Spring 2.5 с аннотациями - PullRequest
8 голосов
/ 10 июня 2009

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

У меня есть проект Spring 2.5, использующий контроллеры форм на основе аннотаций, в основном такие:

@RequestMapping("/edit/someObject")
public String handleSubmit(HttpServletRequest request, HttpServletResponse response, SomeObject someObject, BindingResult result) {

    // Some check here

    if(result.hasErrors()) {
        return "form";
    } else {
        SomeObjectService.update(someObject);
        return "redirect:/view/someObject";
    }
}

В этом я проверяю некоторые свойства http в HttpServletRequest и использую HttpServletResponse для отправки перенаправления, если это свойство имеет определенное значение. Эта проверка выполняется во многих (но не во всех) контроллерах форм в этом приложении. Я хотел бы создать аннотацию @CheckedSubmit, обработанную некоторыми советами AOP, чтобы выполнить эту проверку, а затем отбросить параметры HttpServletRequest и HttpServletResponse из контроллера.

Моя проблема в том, что я не знаю, как получить доступ к текущим HttpServletRequest и HttpServletResponse из этого совета AOP, не используя эти два параметра как (неиспользуемые) для аннотированного метода, чего я и пытался избежать в первую очередь. 1008 *

Резюме: Как получить доступ к HttpServletRequest / Response из рекомендации AOP по аннотированному методу @RequestMapping?

Ответы [ 2 ]

13 голосов
/ 25 ноября 2009

Два решения для резюме, но не для всей вашей проблемы (полностью)

Решение 1: внутренний совет (> = требуется Spring 2.0)

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
        .getRequestAttributes()).getRequest();

Решение 2: внутри класса аспекта (возможно, Spring 3.0 внутри bean-компонентов singelton!)

@Autowired(required=true)
private HttpServletRequest request;
3 голосов
/ 11 июня 2009

Я думаю, вы, наверное, уже знаете это, но «официальным» было сделать это в Spring MVS, чтобы использовать HandlerInterceptors. Они не управляются аннотациями, но они вставляются в поток управления HTTP и получают полный доступ к запросу и ответу.

...