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/path
. Результатом будет ошибка 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 .