2013-03-26 75 views
0

我試圖使用Spring的「forward:」前綴將從一個Controller接收到的請求轉發給第二個Controller。但是,並不像我所期望的那樣將請求轉發到第二個控制器,而是由第一個控制器一次又一次地處理該請求(直到收到StackOverflowError爲止)。這使我認爲它可能將「/ app/pong」視爲某種相對路徑,但我不確定爲什麼會出現這種情況。我誤解了「前進:」應該如何工作?有什麼我在這裏失蹤?使用Spring「forward:」導致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映射:

<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

如果嘗試使用「forward:app/pong」,會發生什麼情況? – CodeChimp

+0

當我嘗試使用「forward:app/pong」時,會發生同樣的事情。 – user2209632

+0

如果你使用重定向:而不是轉發: – arahant

回答

1

我認爲這個問題是有關您的ConfigEd的InternalResourceViewResolver。由於此viewResolver的內部邏輯,它會自動執行轉發,您可以配置另一種viewResolver:UrlBasedViewResolver。
下面是我的官方文件中找到的信息:

也可以使用特殊的前鋒:前綴的視圖名 最終由作爲UrlBasedViewResolver和子類解決。 這會創建一個InternalResourceView(它最終會對視圖名稱的其餘部分執行 RequestDispatcher.forward()),其中 被視爲URL。因此,此前綴對於 InternalResourceViewResolver和InternalResourceView(例如對於JSP)無用。但是,當您主要使用其他視圖技術的 ,但仍希望強制轉發由Servlet/JSP引擎處理的 資源時,前綴會很有幫助。 (請注意,您也可以鏈接多個視圖解析器。)

相關問題