2013-07-12 5 views
0

У меня есть очень странное поведение в одном из моих контроллеров весны, который я не могу объяснить.Loop in Spring Controller Method

Так что это то, что у меня есть. Очень простой контроллер.

@RequestMapping(value="/doSomething") 
public void doSomething(@RequestParam int value, HttpSession session) { 

    System.out.println("Lorem"); 

    // Some stuff later on done here 

    System.out.println("ipsum"); 

} 

Когда я запрашиваю сопоставленный URL-адрес контроллера, он должен иметь бесконечный цикл внутри. Таким образом, он начинается с вывода «Lorem», затем «ipsum», и вместо того, чтобы оставить метод, он снова начинается с начала метода. Он не вызывается несколько раз из внешнего. Кто-нибудь знает это поведение или имеет какое-либо представление? Кроме того, я мог заметить, что скорость вывода замедляется, так как память резко увеличивается примерно до 1,5 ГБ, а 100% загрузка процессора распространяется по каждому ядру. Спасибо за вашу помощь.

ответ

1

Ваш метод обработчика не кажется мне правильным. Как правило, вам необходимо вернуть строку, которая будет решена в Глаза ViewResolver, например:

@RequestMapping(value="/doSomething") 
public String doSomething(@RequestParam int value, HttpSession session) { 
    // .... 
    return "somethingdone"; 
} 
+0

Спасибо за ваш ответ. Мне не нужно указывать весне, чтобы загрузить какой-либо конкретный вид, так как я просто использую контроллер, чтобы сделать что-то. Этот метод называется асинхронным с обычной html-страницы с jQuery. Поэтому в некоторых других случаях я использовал @ResponseBody для получения JSON-кодированного ответа, но в этом случае мне просто не нужен какой-либо ответ. – RaHe

+0

Просто попробовал это с @ResponseBody void, но с тем же результатом. Смешно, что у меня есть другой метод в том же контроллере, где он работает отлично. – RaHe

+0

Проверьте конфигурацию MVC, возможно/doSomething отображается как обработчик ошибок, поэтому при возникновении исключения он возвращается туда (бесконечный цикл). – gerrytan

0

Это мое понимание.

Если контроллер объявляет тип возврата void, Spring попытается вывести имя представления из URL-адреса запроса.

В вашем случае предполагается, что имя вида «doSomething», и продолжайте это предположение.

Он делает это с помощью реализации RequestToViewNameTranslator, реализация по умолчанию RequestToViewNameTranslator является DefaultRequestToViewNameTranslator

См this