2013-03-26 3 views
0

Я пытаюсь перенаправить запрос, полученный от одного контроллера, второму контроллеру с использованием префикса «вперед:» Spring. Однако вместо перенаправления запроса на второй контроллер, как и следовало ожидать, запрос обрабатывается первым контроллером снова и снова (пока я не получу StackOverflowError). Это заставило меня подумать, что это может относиться к «/ app/pong» как относительный путь, но я не уверен, почему это так. Неужели я не понимаю, как работать «вперед»? Есть что-то, чего я здесь не хватает?Использование префикса Spring вперёд: StackOverflowError

Контроллеры:

@Controller 
public class ControllerOne { 
    @RequestMapping(value = "/ping", method = RequestMethod.GET) 
    public String doPing(HttpServletRequest request) { 
    log.debug("Ping?"); 
    return "forward:/app/pong"; 
    } 
} 

@Controller 
public class ControllerTwo { 
    @RequestMapping(value = "/pong", method = RequestMethod.GET) 
    public String doPong(HttpServletRequest request) { 
    log.debug("Pong!"); 
    return "pong"; 
    } 
} 

сервлет-отображение:

<servlet-mapping> 
    <servlet-name>test-servlet</servlet-name> 
    <url-pattern>/app/*</url-pattern> 
</servlet-mapping> 

вид распознаватель:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/jsp/" /> 
    <property name="suffix" value=".jsp" /> 
</bean> 
+0

Что произойдет, если вы попробуете «вперед: приложение/понг»? – CodeChimp

+0

То же самое происходит, когда я пытаюсь использовать «forward: app/pong». – user2209632

+0

Это работает, если вы используете перенаправление: вместо переадресации: – arahant

ответ

1

Я думаю, что проблема о InternalResourceViewResolver что вы configed. Поскольку внутренняя логика этого viewResolver, он будет делать перемотку автоматически, вы можете настроить другие виды viewResolver: UrlBasedViewResolver.
Ниже приводится информация, которую я нашел в официальном документе:

Также можно использовать специальный вперед: префикс для просмотра имен , которые в конечном счете, урегулированных UrlBasedViewResolver и подклассов. Это создает InternalResourceView (что в конечном счете делает RequestDispatcher.forward()) вокруг остальной части имени представления, которое считается URL-адресом. Поэтому этот префикс не полезен для InternalResourceViewResolver и InternalResourceView (например, для JSP). Но префикс может быть полезен, когда вы в основном используете , используя другую технологию просмотра, но все же хотите принудительно перенаправить ресурс , который будет обрабатываться движком Servlet/JSP. (Обратите внимание, что вы, возможно, также можете перехватывать несколько представлений.)