1

Spring の「forward:」プレフィックスを使用して、あるコントローラから受信したリクエストを 2 番目のコントローラに転送しようとしています。ただし、期待どおりにリクエストを2番目のコントローラーに転送する代わりに、リクエストは最初のコントローラーによって何度も処理されます(StackOverflowErrorを受け取るまで)。これは、「/ app/pong」を何らかの相対パスとして扱っているのではないかと思いましたが、なぜそうなるのかはわかりません。「forward:」がどのように機能するかを誤解していますか? 私がここで見逃しているものはありますか?

コントローラー:

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

1 に答える 1

1

問題はInternalResourceViewResolverあなたが設定したことだと思います。この viewResolver の内部ロジックは自動的に転送を行うため、別の種類の viewResolver: UrlBasedViewResolver を構成できます。
以下は、公式ドキュメントで見つけた情報です。

UrlBasedViewResolver とサブクラスによって最終的に解決されるビュー名に、特別な forward: プレフィックスを使用することもできます。これにより、URL と見なされるビュー名の残りの部分にInternalResourceView (最終的には RequestDispatcher.forward() を実行する) が作成されます。したがって、このプレフィックスは、 InternalResourceViewResolverおよび InternalResourceView (JSP など) では役に立ちません 。ただし、主に別のビュー テクノロジを使用しているが、リソースの転送を強制的にサーブレット/JSP エンジンで処理したい場合は、プレフィックスが役立ちます。(代わりに、複数のビュー リゾルバーをチェーンすることもできることに注意してください。)

于 2013-03-26T06:44:14.740 に答える