[解決済み] Spring MVCのテストで "Circular view path "例外を回避する方法
質問
あるコントローラに以下のようなコードがあります。
@Controller
@RequestMapping("/preference")
public class PreferenceController {
@RequestMapping(method = RequestMethod.GET, produces = "text/html")
public String preference() {
return "preference";
}
}
を使ってテストしようとしているだけです。 Spring MVCテスト を以下のようにします。
@ContextConfiguration
@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public class PreferenceControllerTest {
@Autowired
private WebApplicationContext ctx;
private MockMvc mockMvc;
@Before
public void setup() {
mockMvc = webAppContextSetup(ctx).build();
}
@Test
public void circularViewPathIssue() throws Exception {
mockMvc.perform(get("/preference"))
.andDo(print());
}
}
以下のような例外が発生します。
循環ビューパス [環境設定]: 現在のハンドラ URL [/環境設定] に戻ってディスパッチされます。 ハンドラ URL [/preference]に再びディスパッチします。ViewResolverの設定を確認してください。(ヒント: これは、デフォルトのビュー名生成により、指定されていないビューの結果である可能性があります。 の名前生成のためです)。
私が不思議に思うのは を読み込むと正常に動作することです。 を読み込むと正常に動作します。
<bean class="org.thymeleaf.templateresolver.ServletContextTemplateResolver" id="webTemplateResolver">
<property name="prefix" value="WEB-INF/web-templates/" />
<property name="suffix" value=".html" />
<property name="templateMode" value="HTML5" />
<property name="characterEncoding" value="UTF-8" />
<property name="order" value="2" />
<property name="cacheable" value="false" />
</bean>
私は、アプリがこのテンプレートリゾルバを使用する際に、テンプレートリゾルバによって追加されたプレフィックスが、"循環ビューパス"がないことを保証することをよく承知しています。
しかし、それでは、Spring MVC テストを使用してどのように私のアプリをテストすればよいのでしょうか。
どのように解決するには?
これはSpring MVCのテストとは関係ありません。
を宣言しない場合
ViewResolver
を宣言しなかった場合、Springはデフォルトの
InternalResourceViewResolver
のインスタンスを作成します。
JstlView
をレンダリングするために
View
.
は
JstlView
クラスは
InternalResourceView
であり、これは
同じWebアプリケーション内のJSPや他のリソースのラッパーです。 モデルオブジェクトをリクエストの属性として公開し、リクエストを javax.servlet.RequestDispatcherを使って指定されたリソースのURLへ転送します。
このビューの URL はウェブアプリケーション内のリソースを指定することになっています。 このビューの URL は、RequestDispatcher の forward または include メソッドに適した、ウェブアプリケーション内のリソースを指定することになっています。 メソッドに適したものです。
強調は私です。言い換えると、ビューはレンダリング前に
RequestDispatcher
に対して
forward()
. これを行う前に、次のようなチェックが行われます。
if (path.startsWith("/") ? uri.equals(path) : uri.equals(StringUtils.applyRelativePath(uri, path))) {
throw new ServletException("Circular view path [" + path + "]: would dispatch back " +
"to the current handler URL [" + uri + "] again. Check your ViewResolver setup! " +
"(Hint: This may be the result of an unspecified view, due to default view name generation.)");
}
ここで
path
はビューの名前です。
@Controller
. この例では、これは
preference
. 変数
uri
は処理されるリクエストの uri を保持します。
/context/preference
.
上のコードでは、もしあなたが
/context/preference
に転送した場合、同じサーブレットが (前のリクエストを処理したのと同じなので) リクエストを処理することになり、無限ループに入ることになることを上のコードは認識しています。
を宣言すると
ThymeleafViewResolver
と
ServletContextTemplateResolver
に特定の
prefix
と
suffix
を構築します。
View
のようなパスを与えて、異なる方法で構築します。
WEB-INF/web-templates/preference.html
ThymeleafView
インスタンスは、ファイルを
ServletContext
のパスに対して
ServletContextResourceResolver
templateInputStream = resourceResolver.getResourceAsStream(templateProcessingParameters, resourceName);`
というのは、最終的に
return servletContext.getResourceAsStream(resourceName);
これは
ServletContext
パスに相対的なリソースを取得します。これは
TemplateEngine
を使ってHTMLを生成します。ここで無限ループが起こるわけがないのです。
関連
-
[解決済み] ApplicationContextException: ServletWebServerApplicationContext が見つからないため、ServletWebServerFactory ビーンを起動できません。
-
[解決済み] 復旧しようとする宛先のJMSメッセージリスナー起動者のセットアップに失敗しました。
-
[解決済み] Junit with Spring - TestContextManager [ERROR] TestExecutionListenerを許可する際に例外をキャッチしました。
-
SpringトランザクションとMySQLトランザクション詳細インタビュー
-
SpringBootのテスト
-
レスポンスボディとレスポンスエンテイティ
-
[解決済み] java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log
-
[解決済み] Spring MVCの@ResponseBodyメソッドがStringを返すときにHTTP 400エラーで応答するにはどうすればよいですか?
-
[解決済み】データソースの設定に失敗しました:'url'属性が指定されておらず、埋め込まれたデータソースが設定できませんでした。
-
[解決済み] Spring Boot ホワイトラベルエラーページの削除
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】クラスパス上にSpring WebApplicationInitializerの型が検出されない
-
[解決済み】DispatcherServletの名前[duplicate]でURI...を持つHTTPリクエストのマッピングが見つからない。]
-
[解決済み] <mvc:default-servlet-handler />の必要性と用途は何ですか?
-
[解決済み] ApplicationContext(アノテーション付き)の読み込みに失敗しました。
-
SpringプロジェクトがファイルapplicationContext.xmlを解決できないエラー
-
解決方法 原因:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException.NonTransientConnectionExceptionが原因です。
-
SpringBootのテスト
-
[解決済み] WebApplicationContext が見つかりません: ContextLoaderListener が登録されていませんか?
-
[解決済み】SpringのGA、RC、M2リリースの違いは何ですか?
-
[解決済み] Spring MVCのテストで "Circular view path "例外を回避する方法