Весенний совет по методу MVC с отсутствующим аргументом - PullRequest
0 голосов
/ 19 марта 2012

Редактировать

Я думаю, что есть некоторая путаница, я не использую оба перечисленных ниже метода в моем контроллере.Я просто использую "doMethod (запрос HttpServletRequest)".Мой совет применим и работает соответственно.Моя проблема заключается в том, что doMethod (запрос HttpServletRequest) не нуждается в аргументе HttpServletRequest, его использует только совет, который применяется к нему.Поэтому мне было интересно, смогу ли я изменить свой метод с «doMethod (запрос HttpServletRequest)» на «doMethod ()», но все же смогу перехватить HttpServletRequest с помощью примененного к нему совета (потому что я знаю, что у источника где-то есть доступ к нему)1009 *

В Spring MVC у вас может быть такой метод:

@RequestMapping
public void doMethod() {
    //some logic here
}

И если мне понадобится какой-то другой аргумент, я могу изменить его следующим образом:

@RequestMapping
public void doMethod(HttpServletRequest httpServletRequest) {
    //some logic with request
}

И Springбудет делегировать тот же метод в любом случае, но заполните для меня аргумент, если я добавлю его через какое-то волшебство (чего я не понимаю)

У меня вопрос, когда я делаю aop так:

@Before(value=(execution(* * com.domain.package.doMethod(..)), argNames=httpServletRequest)
public void advice(HttpServletRequest httpServetRequest) {
    //some before advice
}

Это имеет смысл при применении ко второму определению метода, но как я могу заставить это работать с первым, если оно не содержит аргумента 'HttpServletRequest'?

1 Ответ

1 голос
/ 19 марта 2012

Я не думаю, что вы можете делать то, что вы хотите. Spring MVC вводит аргумент, получая их из HTTP-запроса (атрибуты, URL и т. Д.). Они также поддерживают список «встроенных» аргументов, которые при упоминании всегда отправляются.

Когда ваш контроллер вызывается нормально в контексте HTTP-запроса, экземпляр HttpRequest будет отправляться всегда, поэтому первая версия этого метода без аргументов никогда не будет вызываться.

Чтобы сделать его вызываемым, вы должны либо сопоставить его с другим URL-адресом, либо с другим методом HTTP, либо с другим типом контента.

...