1. 序章

このチュートリアルでは、SpringMVCアプリケーションでCircularViewPathエラーを取得して解決する方法を見ていきます。

2. 依存関係

これを示すために、簡単なSpring BootWebプロジェクトを作成しましょう。 まず、Mavenプロジェクトファイルに SpringBootWebスターター依存関係を追加する必要があります。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

3. 問題の再現

次に、1つのパスに解決される1つのControllerを使用して単純なSpring Bootアプリケーションを作成しましょう。

@Controller
public class CircularViewPathController {

    @GetMapping("/path")
    public String path() {
        return "path";
    }
}

戻り値は、応答データを生成するビュー名です。 この場合、戻り値は path であり、これはpath.htmlテンプレートに関連付けられています。

<html>
<head>
    <title>path.html</title>
</head>
<body>
    <p>path.html</p>
</body>
</html>

サーバーを起動した後、 http:// localhost:8080 / path にGETリクエストを送信することで、エラーを再現できます。 結果は、CircularViewPathエラーになります。

{"timestamp":"2020-05-22T11:47:42.173+0000","status":500,"error":"Internal Server Error",
"message":"Circular view path [path]: would dispatch back to the current handler URL [/path] 
again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, 
due to default view name generation.)","path":"/path"}

4. ソリューション

デフォルトでは、SpringMVCフレームワークはInternalResourceViewクラスをビューリゾルバーとして適用します。 その結果、@GetMapping値がviewと同じである場合、リクエストはCircularViewパスエラーで失敗します。

考えられる解決策の1つは、ビューの名前を変更し、コントローラーメソッドの戻り値を変更することです。

@Controller
public class CircularViewPathController {
  @GetMapping("/path")
  public String path() {
    return "path2";
  }
}

ビューの名前を変更してコントローラーメソッドの戻り値を変更したくない場合、別の解決策は、プロジェクトに別のビュープロセッサーを選択することです。

最も一般的なケースでは、ThymeleafJavaテンプレートエンジンを選択できます。 spring-boot-starter-thymeleaf依存関係をプロジェクトに追加しましょう。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

プロジェクトを再構築した後、プロジェクトを再度実行でき、リクエストは成功します。 この場合、ThymeleafはInternalResourceViewクラスを置き換えます。

5. 結論

このチュートリアルでは、Circular Viewパスエラー、それが発生する理由、および問題を解決する方法について説明しました。 いつものように、記事の完全なソースコードは、GitHubから入手できます。