«1. Введение

В этом руководстве мы рассмотрим, как мы получаем и устраняем ошибки Circular View Path в приложении Spring MVC.

2. Зависимости

Чтобы продемонстрировать это, давайте создадим простой веб-проект Spring Boot. Во-первых, нам нужно добавить зависимость веб-стартера Spring Boot в наш файл проекта Maven:

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

3. Воспроизведение проблемы

Затем давайте создадим простое приложение Spring Boot с одним контроллером, который разрешается в один путь:

@Controller
public class CircularViewPathController {

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

Возвращаемое значение — это имя представления, которое будет создавать данные ответа. В нашем случае возвращаемым значением является путь, связанный с шаблоном path.html:

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

После запуска сервера мы можем воспроизвести ошибку, отправив запрос GET на адрес http://localhost:8080/. дорожка. Результатом будет ошибка Circular View Path:

{"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. Решения

По умолчанию среда Spring MVC применяет класс InternalResourceView в качестве преобразователя представления. В результате, если значение @GetMapping совпадает с представлением, запрос завершится ошибкой пути кругового представления.

Одно из возможных решений — переименовать представление и изменить возвращаемое значение в методе контроллера.

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

Если мы не хотим переименовывать представление и менять возвращаемое значение в методе контроллера, то другим решением является выбор другого обработчика представления для проекта.

Для наиболее распространенных случаев мы можем выбрать механизм шаблонов Thymeleaf Java. Давайте добавим в проект зависимость spring-boot-starter-thymeleaf:

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

После пересборки проекта мы можем запустить его снова, и запрос выполнен успешно. В этом случае Thymeleaf заменяет класс InternalResourceView.

5. Заключение

В этом руководстве мы рассмотрели ошибку пути Circular View, почему это происходит и как решить проблему. Как всегда, полный исходный код статьи доступен на GitHub.