使用Spring“forward:”前缀导致StackOverflowError

时间:2013-03-26 00:45:31

标签: java spring jsp spring-mvc

我正在尝试使用Spring的“forward:”前缀将从一个Controller收到的请求转发给第二个Controller。但是,不是像我期望的那样将请求转发到第二个控制器,而是由第一个控制器反复处理请求(直到我收到StackOverflowError)。这让我觉得它可能将“/ app / pong”视为某种相对路径,但我不确定为什么会出现这种情况。我误解了“前进:”应该如何运作?我有什么东西在这里缺席吗?

控制器:

@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>

1 个答案:

答案 0 :(得分:1)

我认为问题出在你所说的InternalResourceViewResolver上。因为这个viewResolver的内部逻辑,它会自动执行转发,你可以配置另一种viewResolver:UrlBasedViewResolver。
以下是我在官方文件中找到的信息:

  

也可以为视图名称使用特殊的forward:前缀   最终由UrlBasedViewResolver和子类解决。   这会创建一个 InternalResourceView (最终会创建一个   RequestDispatcher.forward())围绕视图名称的其余部分   被视为URL。因此,此前缀无用    InternalResourceViewResolver 和InternalResourceView(例如用于JSP)。但是,当你主要是前缀时,前缀可能会有所帮助   使用另一种视图技术,但仍然想强制推进一个   Servlet / JSP引擎要处理的资源。 (请注意,你可以   也可以链接多个视图解析器。)