Пытаюсь написать приложение по https://www.toptal.com/spring/beginners-guide-to-mvc-with-spring-framework
Запускается успешно, но на localhost пишет:
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Как исправить ее в данном проекте?
В HTML в строке по типу
<tr th:each="student : ${students}">
students
выделяется как ошибка. Почему?
К
задан 4 окт 2016 в 18:52
7
При работе Spring Boot
+ Freemarker
если появляется страница:
Whitelabel Error Page
This application has no explicit mapping for
/error, so you are seeing this as a fallback.
В версии spring-boot-starter-parent 2.2.1.RELEASE
не работает freemarker
:
- переименуйте файлы
Freemarker
c.ftl
на.ftlh
-
Добавьте в
application.properties
:spring.freemarker.expose-request-attributes=true
spring.freemarker.suffix= .ftl
Coder
2,7202 золотых знака9 серебряных знаков16 бронзовых знаков
ответ дан 26 ноя 2019 в 19:37
MaxMax
312 бронзовых знака
Проблема #1: на /
ничего не замаплено, поэтому при открытии сайта вы видите подобную ошибку.
Проблема #2: если обратиться по адресу /students
, то появляется еще одна ошибка, но уже другая: Exception evaluating SpringEL expression: "student.forename + ' ' + student.surame" (students:16)
. Если очень внимательно посмотреть, то уже ясно в чем дело, но на всякий случай можно посмотреть в консоль на исключение: org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 33): Property or field 'surame' cannot be found on object of type 'wenti.entity.Student' - maybe not public?
Причина в банальной опечатке — вы обращаетесь к полю surame
, вместо surname
.
ответ дан 5 окт 2016 в 18:26
Slava SemushinSlava Semushin
2,17213 серебряных знаков13 бронзовых знаков
В дополнение к ответу о том, что:
При работе Spring Boot + Freemarker если появляется страница:
Whitelabel Error Page
This application has no explicit mapping for error, so you are seeing this as a fallback.
У меня версия spring-boot-starter-parent 2.5.3 чтобы работал freemarker сделал следующее:
Добавьте в ваш файл application.properties:
spring.freemarker.expose-request-attributes=true
spring.freemarker.cache=false
spring.freemarker.template-loader-path=file:src/main/resources/templates/
spring.freemarker.suffix: .ftl
0xdb
51.3k194 золотых знака56 серебряных знаков227 бронзовых знаков
ответ дан 16 авг 2021 в 10:05
В ошибке написано, что неверный мапинг по адресу /error
. Spring перенаправляет вас на страницу /error
когда по вашему GET запросу произошла ошибка на сервере.
Какие есть варианты
1. Ошибка при получении/обработке данных на сервере (как пример NullPointerException
). Пройтись дебагом по коду, посмотреть не выпадает ли где exception.
2. Ошибка при парсинге страницы thymeleaf.
Посмотрите лог, скорее всего ваша ошибка выше, чем то, что вы указали в отрывке.
ответ дан 5 окт 2016 в 10:29
flyboxflybox
6105 серебряных знаков15 бронзовых знаков
1
Содержание
- Русские Блоги
- Основная причина страницы ошибки SpringBoot Whitelabel, три решения и их характеристики
- 0, краткое описание
- 1. Страница ошибки Whitelabel
- 2. Решите проблему с белой страницей.
- Whitelabel error page что это за ошибка
- Spring выдает ошибку Whitelabel error page, что не так?
- В этом приложении нет явного сопоставления для / error
- Проблемы с простым проектом с Spring Framework
Русские Блоги
Основная причина страницы ошибки SpringBoot Whitelabel, три решения и их характеристики
0, краткое описание
Перед изучением этой заметки лучше всего иметь некоторое представление о Spring mvc и Tomcat, чтобы было удобнее понимать.Если вам нужно знать наиболее прямое решение, перетащите его вниз, чтобы увидеть образец кода.
Вводится настоящая причина появления белой страницы Springboot. Основная причина заключается в том, что нет подходящей ситуации соответствия и возникает ситуация 404. Затем перейдите к системной по умолчанию сначала ErrorPage, которая представляет собой содержимое белой страницы, а затем с трех точек зрения в соответствии с его спецификой. , 1. Перехватчик, 2. Новая страница ошибок, 3. Пользовательская маршрутизация / маршрутизация ошибок для решения проблемы, а также знакомство с преимуществами и недостатками каждого метода, включая основные причины ошибок страницы цикла и т. Д.
1. Страница ошибки Whitelabel
То, что называется страницей ошибок Whitelabel (также называемой белой страницей), является страницей описания аномального HTTP-запроса в SpringBoot, как показано ниже.
Содержимое белой страницы будет отображать код состояния, путь и причину ошибки, но реальная среда публикации онлайн-генерации обычно не допускает такой ситуации, и больше — это настраиваемые страницы 404 или 500 страниц.
Итак, теперь мы пришли к пониманию, в какой ситуации будут появляться белые страницы и как решить эту проблему. Давайте воспользуемся случаем 404, чтобы понять причину.
Перейти непосредственно к классу DispatcherServlet protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception Метод, содержащий фрагменты кода
В методе getHandler будет выполняться обход HandlerMapping в текущем веб-контейнере, чтобы найти соответствующий обработчик
Из приведенного выше рисунка очевидно, что текущий удобный обработчик — SimpleUrlHandlerMapping, потому что URL-адрес содержит /** , Все URL-адреса могут быть сопоставлены, Не войдет в noHandlerFound позади , Обработчик адаптации HandlerAdapter — это объект, созданный HttpRequestHandlerAdapter.
Не удается найти соответствующий ресурс в mv = ha.handle (loadedRequest, response, mappedHandler.getHandler ()), установите код состояния ответа на 404Подробнее см. Метод handleRequest класса ResourceHttpRequestHandler.
Теперь это эквивалентно установке кода состояния запроса на 404, больше ничего не делается, mv также равно null
В это время вам нужно вернуться к процессу вызова Tomcat. Если вы запрашиваете процесс вызова Tomcat, вы должны знать, что когда Tomcat получает запрос сокета Socket на соединителе, он упаковывается в запрос, ответ и другую информацию, которая будет отправлена в Engine-> Host и другие компоненты. Он доставляется слой за слоем, затем принимается конвейером каждого компонента, а затем фильтруется соответствующим клапаном (клапаном) слой за слоем.
На этот раз дошел до класса StandardHostValve private void status(Request request, Response response) метод
Объедините код и диаграмму, а затем внимательно прочтите белую страницу. This application has no explicit mapping for /error , Маршрут error, причина отсюда, а затем переход вперед, адрес маршрута error
Белая страница mv, предоставляемая SpringBoot, используется позже для визуализации содержимого белой страницы, которую мы видим.
Пока что весь процесс выполнен,Подводя итог, это запрос несуществующей ссылки, которая перенаправляется в запрос / error после того, как обнаруживается, что это запрос 404.
Тогда решение очень простое, есть три решения, но эти три решения под разными углами, чтобы решить проблему.
- Добавить перехватчик
- Добавить ErrorPage
- Добавить / путь ошибки
2. Решите проблему с белой страницей.
2.1, добавить перехватчик
После того, как перехватчик перехватит запрос / error, он вынужден изменить mv, так что последний отрендеренный mv для пробного использования является нашей настраиваемой настройкой, а не содержимым белой страницы, где mv самой белой страницы будет проходить Анализатор представления ContentNegotiating Обработка становится ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration
Обратите внимание, что все это истечение фактически было обработано 3 HTTP-запросами,На следующем рисунке показана информация журнала, распечатанная с использованием мониторинга событий HTTP.
Пройдите через / abc ==> jump / err ==> jump / error (содержимое не отображается, потому что содержимое, отправленное в браузер, было отображено с помощью / err
Реальный поток обработки вызовов состоит в том, что / abc не находит подходящий обработчик, а затем решает передать его на путь / error для обработки, но он перехватывается перехватчиком и перенаправляется в / err для обработки.
Недостатки: все запросы для этого маршрута будут перехвачены, включая статические файлы ресурсов, что не оказывает большого влияния на внутренние службы, которые предоставляют чистые интерфейсы. Другие службы будут иметь влияние
2.2, добавьте ErrorPage
Добавление подходящей ErrorPage не приведет к переходу к пути по умолчанию / ошибке перехватчика, а перейдет к настраиваемой ErrorPage. Причина этого была указана в методе статуса выше.
В приведенном выше коде добавлено несколько путей перехода к странице ошибки ErrorPage и соответствующие им коды ошибок HTTP. В нашем текущем примере должен быть выполнен переход к соединению / 404, а затем как я могу получить сообщение об ошибке после его выполнения? В принципе, он должен отображать 404 Содержимое файла .html и классическая страница ошибок Tomcat отображаются одновременно, как показано на следующей странице, и содержимое вывода журнала.
Это проблема скачка петли
Когда в системе не указан преобразователь четкого представления, система будет использовать свой собственный преобразователь по умолчанию. InternalResourceView , Он проверит текущий URL-адрес перед отображением. Если обнаружится, что запрошенный URL-адрес соответствует целевому URL-адресу, он будет определен Вперед сам появляются Circular view path Эта проблема
Итак, как ее решить, нужно исходить из фундаментальной цели
- Добавьте синтаксический анализатор шаблона, чтобы синтаксический анализатор по умолчанию не использовался
- Изменить путь перехода
Вы можете понять конкретные решения самостоятельно.В этой статье не используется отрисовка механизма шаблонов, а непосредственно отображаются основные данные.
2.3, путь добавления / ошибки
Как вы знаете выше, поскольку система по умолчанию переходит к / error и завершает рендеринг данных, недостаточно настроить маршрут / error и избежать проблемы отсутствия статических ресурсов, но обратите внимание, что есть Один вопрос, подробности см. На рисунке ниже
Во-первых, я добавил и определил очень простой метод обработки пути ошибки, но при запуске Springboot есть 3 метода обработки пути ошибки, и они одновременно принадлежат одному и тому же дескриптору. Правила маршрутизации URL Обработка, выберите ручку в автоконфигурации,Это должно было привести к тому, что наш заказ / ошибка недействительны
После тестирования он действительно недействителен, и белая страница все еще отображается, так как это решить? Есть несколько способов сделать то же самое
- В соответствии с правилами сопоставления маршрутизации измените соответствующий контент, чтобы при окончательном выборе процессора он достиг нашего пользовательского процессора, но это очень сложно. Вам необходимо очень четко понимать правила сопоставления маршрутизации самого Spring mvc, чтобы гарантировать, что сопоставление URL-адресов Приоритетные вопросы, требующие решения, и т. Д.
Мы уже знаем, что эти три / ошибки находятся в картографе маршрутов RequestMappingHandlerMapping.Мы можем сделать так, чтобы пользовательский процессор не сохранялся в карте маршрутов, и сделать Spring приоритетом согласованного преобразователя маршрутов при опросе. Да, но на самом деле BeanNameUrlMapping в handlerMapping все еще находится после RequestMappingHandlerMapping, если вы измените порядок, это также очень сложно
EndpointHandlerMapping — это конечная точка в исполнительном модуле Springboot. Настроить конечную точку сложно, и она не подходит для текущего проекта.
Использование SimpleUrlHandlerMapping не подходит для Springboot. Если вы используете конфигурацию xml, вы можете напрямую установить ее URL-адрес. Это будет очень удобно. Если вы применяете метод аннотации в springboot, требуется дополнительная настройка, как показано в следующем коде
Хотя / error вводится в SimpleUrlHandlerMapping, он все равно будет отображаться, даже если добавлена дополнительная конфигурация Нет ошибки адаптера ,Этот метод не применим
Оглядываясь назад на наблюдение BasicErrorController, мы можем унаследовать интерфейс ErrorController сами.
Источник
Whitelabel error page что это за ошибка
Spring выдает ошибку Whitelabel error page, что не так?
давай читать то, что написано вместе за ручку =)
«это приложение не имеет эксплицитного (явного) маппинга для /error, поэтому ты видишь это»
добавь какой-то любой маппинг напр
@RestController
public class MyController
@GetMapping(«/error»)
public String smth() return «Error world»;
>
>
пробегись по spring boot in action. сам не читал, но говорят годная, странич всего ничего
в пропертях добавь
server.error.whitelabel.enabled=false
ну или нарисуй свою страничку error.html
закинь в resources/templates
создай свой контроллер чтоб перехватить дефолтовое поведение
@Controller
public class MyErrorController implements ErrorController
@RequestMapping(«/error»)
public String handleError() //do something like logging
return «error»;
>
@Override
public String getErrorPath() return «/error»;
>
>
можешь под каждую свою ошибку свою error страничку сделать
типа error404.html error500.html
и переписать метод вот так
@RequestMapping(«/error»)
public String handleError(HttpServletRequest request) Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
if (status != null) Integer statusCode = Integer.valueOf(status.toString());
if(statusCode == HttpStatus.NOT_FOUND.value()) return «error404»;
>
else if(statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) return «error500»;
>
>
return «error»;
>
тогда будет подгружать нужную тебе страничку ошибки.
но как ты уже понял. это всё лишь чтоб настроить что показывать.
почему именно у тебя ошибка происходит — это ты уж в своём аппе копайся.
В этом приложении нет явного сопоставления для / error
Я использовал maven для создания учебника https://spring.io/guides/gs/uploading-files/
Все используемые мной коды были скопированы.
Приложение может работать, но я получаю сообщение об ошибке:
Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Tue Jun 30 17:24:02 CST 2015 There was an unexpected error (type=Not Found, status=404). No message available
Как я могу это исправить?
Убедитесь, что ваш основной класс находится в корневом пакете над другими классами.
Когда вы запускаете приложение Spring Boot (т. Е. Класс, помеченный @SpringBootApplication), Spring будет сканировать только классы, расположенные ниже вашего основного пакета классов.
Когда мы создаем загрузочное приложение Spring, мы аннотируем его @SpringBootApplication аннотациями. Эта аннотация «завершает» многие другие аннотации, необходимые для работы приложения. Одна из таких аннотаций — @ComponentScan аннотация. Эта аннотация сообщает Spring искать компоненты Spring и настраивать приложение для запуска.
Класс вашего приложения должен быть на вершине иерархии пакетов, чтобы Spring мог сканировать подпакеты и находить другие необходимые компоненты.
Ниже фрагмент кода работает, поскольку пакет контроллера находится в com.test.spring.boot пакете
Ниже фрагмент кода НЕ работает, поскольку пакет контроллера НЕ находится в com.test.spring.boot пакете
Из документации Spring Boot:
Many Spring Boot developers always have their main class annotated with @Configuration , @EnableAutoConfiguration and @ComponentScan . Since these annotations are so frequently used together (especially if you follow the best practices above), Spring Boot provides a convenient @SpringBootApplication alternative.
The @SpringBootApplication annotation is equivalent to using @Configuration , @EnableAutoConfiguration and @ComponentScan with their default attributes
Вы можете решить эту проблему, добавив ErrorController в свое приложение. Вы можете заставить контроллер ошибок возвращать нужное вам представление.
Контроллер ошибок в моем приложении выглядит так:
Вышеупомянутый класс основан на классе Springs BasicErrorController .
Вы можете создать экземпляр вышеуказанного ErrorController в @Configuration файле следующим образом:
Вы можете переопределить значение ErrorAttributes по умолчанию , реализовав ErrorAttributes . Но в большинстве случаев атрибутов DefaultErrorAttributes должно быть достаточно.
В моем случае класс контроллера был аннотирован @Controller . Изменив это, чтобы @RestController решить проблему. В основном @RestController это @Controller + @ResponseBody так либо использовать @RestController , либо @Controller с @ResponseBody аннотацией к каждому методу.
в моем случае это из-за позиции пакета, то есть пакет контроллера должен быть выше пакета основного класса
если мой пакет основного класса — это package co.companyname.spring.tutorial; любой пакет контроллера, package co.companyname.spring.tutorial.WHAT_EVER_HERE;
после завершения кодирования нажмите кнопку загрузки приборной панели
последнее, что нужно, чтобы убедиться, что ваш контроллер отображает или не только консоль, вы должны увидеть что-то smilliar
Это происходит, когда явная страница ошибки не определена. Чтобы определить страницу ошибки, создайте сопоставление / error с представлением. например, приведенный ниже код сопоставляется со строковым значением, возвращаемым в случае ошибки.
Попробуйте добавить зависимость.
По умолчанию весенняя загрузка будет сканировать текущий пакет на предмет определения bean-компонента. Поэтому, если ваш текущий пакет, в котором определен основной класс, а пакет контроллера не совпадает, или пакет контроллера не является дочерним пакетом вашего основного пакета приложения, он не будет сканировать контроллер. Чтобы решить эту проблему, можно включить список пакетов для определения bean-компонента в основной пакет.
или создать иерархию пакетов, в которой дочерний пакет является производным от основного пакета
Я разрабатываю приложение Spring Boot в течение нескольких недель .. И я получил ту же ошибку, что и ниже;
Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Thu Jan 18 14:12:11 AST 2018 There was an unexpected error (type=Not Found, status=404). No message available
Когда я получаю это сообщение об ошибке, я понял, что мой контроллер или класс контроллера отдыха не определен в моем проекте. Я имею в виду, что все наши пакеты контроллеров не являются одним и тем же пакетом с основным классом, который включает аннотацию @SpringBootApplication .. Я имею в виду, что вам нужно добавить имя вашего пакета контроллера в аннотацию @ComponentScan к вашему основному классу, который включает аннотацию @SpringBootApplication. Если вы напишете приведенные ниже коды, ваша проблема будет решена . Самое главное, вы должны добавить весь пакет вашего контроллера в аннотацию @ComponentScan, как я сделал в приведенном ниже
Я надеюсь, что эти коды помогут кому-то .
Если вы найдете другой способ решить эту ошибку или у вас есть предложения для меня, напишите в комментарии . спасибо .
Проблемы с простым проектом с Spring Framework
Пытаюсь написать приложение по https://www.toptal.com/spring/beginners-guide-to-mvc-with-spring-framework Запускается успешно, но на localhost пишет:
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Как исправить ее в данном проекте?
В HTML в строке по типу
выделяется как ошибка. Почему?
При работе Spring Boot + Freemarker если появляется страница:
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
В версии spring-boot-starter-parent 2.2.1.RELEASE не работает freemarker :
- переименуйте файлы Freemarker c .ftl на .ftlh
Добавьте в application.properties :
spring.freemarker.expose-request-attributes=true
spring.freemarker.suffix= .ftl
Проблема #1: на / ничего не замаплено, поэтому при открытии сайта вы видите подобную ошибку.
Проблема #2: если обратиться по адресу /students , то появляется еще одна ошибка, но уже другая: Exception evaluating SpringEL expression: «student.forename + ‘ ‘ + student.surame» (students:16) . Если очень внимательно посмотреть, то уже ясно в чем дело, но на всякий случай можно посмотреть в консоль на исключение: org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 33): Property or field ‘surame’ cannot be found on object of type ‘wenti.entity.Student’ — maybe not public? Причина в банальной опечатке — вы обращаетесь к полю surame , вместо surname .
В ошибке написано, что неверный мапинг по адресу /error . Spring перенаправляет вас на страницу /error когда по вашему GET запросу произошла ошибка на сервере.
Какие есть варианты 1. Ошибка при получении/обработке данных на сервере (как пример NullPointerException ). Пройтись дебагом по коду, посмотреть не выпадает ли где exception. 2. Ошибка при парсинге страницы thymeleaf.
Посмотрите лог, скорее всего ваша ошибка выше, чем то, что вы указали в отрывке.
В дополнение к ответу о том, что:
При работе Spring Boot + Freemarker если появляется страница:
Whitelabel Error Page
This application has no explicit mapping for error, so you are seeing this as a fallback.
У меня версия spring-boot-starter-parent 2.5.3 чтобы работал freemarker сделал следующее:
Источник
0, краткое описание
Перед изучением этой заметки лучше всего иметь некоторое представление о Spring mvc и Tomcat, чтобы было удобнее понимать.Если вам нужно знать наиболее прямое решение, перетащите его вниз, чтобы увидеть образец кода.
Вводится настоящая причина появления белой страницы Springboot. Основная причина заключается в том, что нет подходящей ситуации соответствия и возникает ситуация 404. Затем перейдите к системной по умолчанию сначала ErrorPage, которая представляет собой содержимое белой страницы, а затем с трех точек зрения в соответствии с его спецификой. , 1. Перехватчик, 2. Новая страница ошибок, 3. Пользовательская маршрутизация / маршрутизация ошибок для решения проблемы, а также знакомство с преимуществами и недостатками каждого метода, включая основные причины ошибок страницы цикла и т. Д.
1. Страница ошибки Whitelabel
То, что называется страницей ошибок Whitelabel (также называемой белой страницей), является страницей описания аномального HTTP-запроса в SpringBoot, как показано ниже.
image
Содержимое белой страницы будет отображать код состояния, путь и причину ошибки, но реальная среда публикации онлайн-генерации обычно не допускает такой ситуации, и больше — это настраиваемые страницы 404 или 500 страниц.
Итак, теперь мы пришли к пониманию, в какой ситуации будут появляться белые страницы и как решить эту проблему. Давайте воспользуемся случаем 404, чтобы понять причину.
Перейти непосредственно к классу DispatcherServletprotected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception
Метод, содержащий фрагменты кода
mappedHandler = getHandler(processedRequest);
// находим подходящий обработчик запроса
if (mappedHandler == null || mappedHandler.getHandler() == null) {
// В принципе, если вы его не найдете, введите здесь и установите код статуса ответа 404
// Но после отладки так и не вошел сюда
noHandlerFound(processedRequest, response);
return;
}
В методе getHandler будет выполняться обход HandlerMapping в текущем веб-контейнере, чтобы найти соответствующий обработчик
image
image
Из приведенного выше рисунка очевидно, что текущий удобный обработчик — SimpleUrlHandlerMapping, потому что URL-адрес содержит/**
, Все URL-адреса могут быть сопоставлены,Не войдет в noHandlerFound позади
, Обработчик адаптации HandlerAdapter — это объект, созданный HttpRequestHandlerAdapter.
Не удается найти соответствующий ресурс в mv = ha.handle (loadedRequest, response, mappedHandler.getHandler ()), установите код состояния ответа на 404Подробнее см. Метод handleRequest класса ResourceHttpRequestHandler.
Теперь это эквивалентно установке кода состояния запроса на 404, больше ничего не делается, mv также равно null
В это время вам нужно вернуться к процессу вызова Tomcat. Если вы запрашиваете процесс вызова Tomcat, вы должны знать, что когда Tomcat получает запрос сокета Socket на соединителе, он упаковывается в запрос, ответ и другую информацию, которая будет отправлена в Engine-> Host и другие компоненты. Он доставляется слой за слоем, затем принимается конвейером каждого компонента, а затем фильтруется соответствующим клапаном (клапаном) слой за слоем.
На этот раз дошел до класса StandardHostValveprivate void status(Request request, Response response)
метод
private void status(Request request, Response response) {
int statusCode = response.getStatus();
// Просмотр текущего кода состояния, текущий пример - 404
// Получить текущий контекст
Context context = request.getContext();
if (context == null) {
return;
}
if (!response.isError()) {
// Текущий запрос верен
// это атомарный класс AtomicInteger errorState, если он больше 0, это считается ошибкой
return;
}
ErrorPage errorPage = context.findErrorPage(statusCode);
// Об этом месте поговорим позже, это решение, устанавливаем страницу ошибки
if (errorPage == null) {
// Look for a default error page
errorPage = context.findErrorPage(0);
}
if (errorPage != null && response.isErrorReportRequired()) {
...
image
Объедините код и диаграмму, а затем внимательно прочтите белую страницу.This application has no explicit mapping for /error
, Маршрут error, причина отсюда, а затем переход вперед, адрес маршрута error
image
Белая страница mv, предоставляемая SpringBoot, используется позже для визуализации содержимого белой страницы, которую мы видим.
Пока что весь процесс выполнен,Подводя итог, это запрос несуществующей ссылки, которая перенаправляется в запрос / error после того, как обнаруживается, что это запрос 404.
Тогда решение очень простое, есть три решения, но эти три решения под разными углами, чтобы решить проблему.
- Добавить перехватчик
- Добавить ErrorPage
- Добавить / путь ошибки
2. Решите проблему с белой страницей.
2.1, добавить перехватчик
public class CustomHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
// Должно быть истиной, иначе перехватчик не сработает
// Конечно, вы можете перехватывать любые URL-адреса по желанию
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
if (modelAndView != null) {
// Предотвращаем нулевые указатели
// Если это страница с ошибкой в springboot, определенно не будет отображаться, что mv имеет значение null
modelAndView.setViewName("/err");
// Примечание: этот запрос является всего лишь пробным и не имеет практического значения
}
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
}
}
@Bean
public WebMvcConfigurerAdapter customMvcConfigurerAdapter (){
return new WebMvcConfigurerAdapter() {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new CustomHandlerInterceptor()).addPathPatterns("/**");
// добавляем перехватчик
super.addInterceptors(registry);
}
};
}
После того, как перехватчик перехватит запрос / error, он вынужден изменить mv, так что последний отрендеренный mv для пробного использования является нашей настраиваемой настройкой, а не содержимым белой страницы, где mv самой белой страницы будет проходитьАнализатор представления ContentNegotiating
Обработка становитсяErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration
Обратите внимание, что все это истечение фактически было обработано 3 HTTP-запросами,На следующем рисунке показана информация журнала, распечатанная с использованием мониторинга событий HTTP.
image
Пройдите через / abc ==> jump / err ==> jump / error (содержимое не отображается, потому что содержимое, отправленное в браузер, было отображено с помощью / err
Реальный поток обработки вызовов состоит в том, что / abc не находит подходящий обработчик, а затем решает передать его на путь / error для обработки, но он перехватывается перехватчиком и перенаправляется в / err для обработки.
Недостатки: все запросы для этого маршрута будут перехвачены, включая статические файлы ресурсов, что не оказывает большого влияния на внутренние службы, которые предоставляют чистые интерфейсы. Другие службы будут иметь влияние
2.2, добавьте ErrorPage
Добавление подходящей ErrorPage не приведет к переходу к пути по умолчанию / ошибке перехватчика, а перейдет к настраиваемой ErrorPage. Причина этого была указана в методе статуса выше.
@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer configurableEmbeddedServletContainer) {
ErrorPage errorPage400 = new ErrorPage(HttpStatus.BAD_REQUEST,"/400");
ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND,"/404");
ErrorPage errorPage500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR,"/500");
configurableEmbeddedServletContainer.addErrorPages(errorPage400,errorPage404,errorPage500);
}
};
}
// ======= разделительная линия
@ApiOperation («запрос 404»)
@GetMapping("404")
public String e404() {
return "404";
}
В приведенном выше коде добавлено несколько путей перехода к странице ошибки ErrorPage и соответствующие им коды ошибок HTTP. В нашем текущем примере должен быть выполнен переход к соединению / 404, а затем как я могу получить сообщение об ошибке после его выполнения? В принципе, он должен отображать 404 Содержимое файла .html и классическая страница ошибок Tomcat отображаются одновременно, как показано на следующей странице, и содержимое вывода журнала.
image
image
Это проблема скачка петли
Когда в системе не указан преобразователь четкого представления, система будет использовать свой собственный преобразователь по умолчанию.InternalResourceView
, Он проверит текущий URL-адрес перед отображением. Если обнаружится, что запрошенный URL-адрес соответствует целевому URL-адресу, он будет определенВперед сам
появляютсяCircular view path
Эта проблема
protected String prepareForRendering(HttpServletRequest request, HttpServletResponse response)
throws Exception {
String path = getUrl();
if (this.preventDispatchLoop) {
String uri = request.getRequestURI();
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.)");
}
}
return path;
}
Итак, как ее решить, нужно исходить из фундаментальной цели
- Добавьте синтаксический анализатор шаблона, чтобы синтаксический анализатор по умолчанию не использовался
- Изменить путь перехода
Вы можете понять конкретные решения самостоятельно.В этой статье не используется отрисовка механизма шаблонов, а непосредственно отображаются основные данные.
@RequestMapping("/")
@RestController
public class ErrorController {
@ApiOperation («запрос 404»)
@GetMapping("404")
public String e404() {
System.out.println("404............");
return "Это действительно страница 404, посмотрите на нее";
}
image
2.3, путь добавления / ошибки
Как вы знаете выше, поскольку система по умолчанию переходит к / error и завершает рендеринг данных, недостаточно настроить маршрут / error и избежать проблемы отсутствия статических ресурсов, но обратите внимание, что есть Один вопрос, подробности см. На рисунке ниже
image
image
Во-первых, я добавил и определил очень простой метод обработки пути ошибки, но при запуске Springboot есть 3 метода обработки пути ошибки, и они одновременно принадлежат одному и тому же дескриптору.Правила маршрутизации URL
Обработка, выберите ручку в автоконфигурации,Это должно было привести к тому, что наш заказ / ошибка недействительны
image
После тестирования он действительно недействителен, и белая страница все еще отображается, так как это решить? Есть несколько способов сделать то же самое
- В соответствии с правилами сопоставления маршрутизации измените соответствующий контент, чтобы при окончательном выборе процессора он достиг нашего пользовательского процессора, но это очень сложно. Вам необходимо очень четко понимать правила сопоставления маршрутизации самого Spring mvc, чтобы гарантировать, что сопоставление URL-адресов Приоритетные вопросы, требующие решения, и т. Д.
-
Мы уже знаем, что эти три / ошибки находятся в картографе маршрутов RequestMappingHandlerMapping.Мы можем сделать так, чтобы пользовательский процессор не сохранялся в карте маршрутов, и сделать Spring приоритетом согласованного преобразователя маршрутов при опросе. Да, но на самом деле BeanNameUrlMapping в handlerMapping все еще находится после RequestMappingHandlerMapping, если вы измените порядок, это также очень сложно
image
EndpointHandlerMapping — это конечная точка в исполнительном модуле Springboot. Настроить конечную точку сложно, и она не подходит для текущего проекта.
Использование SimpleUrlHandlerMapping не подходит для Springboot. Если вы используете конфигурацию xml, вы можете напрямую установить ее URL-адрес. Это будет очень удобно. Если вы применяете метод аннотации в springboot, требуется дополнительная настройка, как показано в следующем коде
@RequestMapping("/")
@Controller
public class SimpleUrlController {
private static final String ERROR_PATH = "/error";
@Resource
private SimpleUrlHandlerMapping simpleUrlHandlerMapping;
@PostConstruct
public void init() {
Map<String, Object> map = new HashMap<>();
map.put(ERROR_PATH, this);
simpleUrlHandlerMapping.setUrlMap(map);
simpleUrlHandlerMapping.initApplicationContext();
// Вызываем отображение simpleurl
}
@GetMapping("/error")
@ResponseBody
public String error(HttpServletRequest request) {
System.out.println("SimpleUrlController");
Enumeration<String> attributes = request.getAttributeNames();
Map<String, Object> map = new HashMap<String, Object>();
while (attributes.hasMoreElements()) {
String name = attributes.nextElement();
if (name.startsWith("java")) {
// Помните, что свойства самой пружины не должны быть выставлены снаружи!
Object value = request.getAttribute(name);
map.put(name, value);
}
}
return JSON.toJSONString(map);
}
}
image
Хотя / error вводится в SimpleUrlHandlerMapping, он все равно будет отображаться, даже если добавлена дополнительная конфигурацияНет ошибки адаптера
,Этот метод не применим
Оглядываясь назад на наблюдение BasicErrorController, мы можем унаследовать интерфейс ErrorController сами.
@RequestMapping("")
@Controller
public class CustomErrorController implements ErrorController {
private static final String ERROR_PATH = "/error";
@GetMapping(ERROR_PATH)
@ResponseBody
public String error(HttpServletRequest request) {
System.out.println("CustomErrorController");
Enumeration<String> attributes = request.getAttributeNames();
Map<String, Object> map = new HashMap<String, Object>();
while (attributes.hasMoreElements()) {
String name = attributes.nextElement();
if (name.startsWith("java")) {
// Помните, что свойства самой пружины не должны подвергаться воздействию извне!
Object value = request.getAttribute(name);
map.put(name, value);
}
}
return JSON.toJSONString(map);
}
@Override
public String getErrorPath() {
return ERROR_PATH;
}
}
В этом посте мы обсудим, как отключить страницу ошибок Whitelabel в Spring Boot.
Мы знаем, что Spring Boot отображает страницу ошибки Whitelabel, если вы сталкиваетесь с ошибкой сервера. Типичная страница ошибки Whitelabel в клиентском браузере выглядит следующим образом:
Whitelabel Error Page
This application has no explicit mapping for /error, so you see this as a fallback.
Tue Dec 25 14:23:07 IST 2018
There was an unexpected error (type=Not Found, status=404).
No message available
Существует несколько способов отключить страницу ошибок Whitelabel по умолчанию в Spring Boot и заменить ее страницей ошибок вашего контейнера сервлетов. Мы также можем добавить вашу собственную страницу ошибки, а не отключать ее полностью, и отправить клиенту разумный ответ с правильным кодом ошибки.
1. Файл свойств
Если мы установим server.error.whitelabel.enabled
собственность на false
в application.properties
или же application.yml
, он отключает страницу ошибки по умолчанию. Это приведет к тому, что вместо этого будут отображаться страницы ошибок контейнера сервлетов. Например, встроенный контейнер tomcat теперь отображает сообщение об ошибке ‘HTTP Status 404 — Not Found’.
2. Исключение bean-компонента ErrorMvcAutoConfiguration
Мы также можем отключить ErrorMvcAutoConfiguration
bean внутри основного класса, чтобы удалить страницу ошибки Whitelabel. Это также восстановит страницу ошибок по умолчанию для контейнера сервлетов, который вы используете.
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration; @SpringBootApplication @EnableAutoConfiguration(exclude = {ErrorMvcAutoConfiguration.class}) public class Main { public static void main(String[] args) { SpringApplication.run(Main.class, args); } } |
Мы также можем сделать это в файле свойств приложения/YAML.
application.properties
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration |
application.yml
spring: autoconfigure: exclude: org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration |
Обратите внимание, что все вышеупомянутые методы по-прежнему отображают страницу ошибки контейнера сервлета. Рекомендуемый подход заключается в создании представления, которое разрешается с помощью имени ошибки или @Controller
который обрабатывает /error
дорожка. Это обсуждается здесь.
Это все об отключении страницы ошибок Whitelabel в Spring Boot.
Спасибо за чтение.
Пожалуйста, используйте наш онлайн-компилятор размещать код в комментариях, используя C, C++, Java, Python, JavaScript, C#, PHP и многие другие популярные языки программирования.
Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования 🙂
By
Atul Rai |
Last Updated: October 2, 2019
Previous Next
In this article, we will explore how to handle Whitelabel Error Page in Spring Boot application. During the development of Spring application, sometimes we face the Whitelabel Error Page and Spring Framework suggests us ‘This application has no explicit mapping for /error
, so you are seeing this as a fallback‘ as shown below:
P.S Tested with Spring Boot and Thymeleaf 2.1.8.RELEASE version.
We can resolve the Whitelabel Error Page error in 3 ways:
1. Custom Error Controller
By implementing the ErrorController
interface provided by the Spring Framework itself and overrides its getErrorPath()
method to return a custom path to call when an error occurred:
ErrorrHandlerController.java
package org.websparrow.controller;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ErrorrHandlerController implements ErrorController {
@GetMapping("/error")
public String customError() {
return "The link you followed may be broken, or the page may have been removed.";
}
@Override
public String getErrorPath() {
return "/error";
}
}
In the customError()
method, we return the custom message. If we trigger a 404, 500, etc error now, our custom message will be displayed.
2. Displaying Custom Error Page
Create a error.html page and put it into the src/main/resources/templates directory. Spring Boot’s BasicErrorController
will automatically be picked it up by default.
error.html
<!DOCTYPE html>
<html>
<title>Error</title>
<body>
<h1>Something went wrong!</h1>
<p>The link you followed may be broken, or the page may have been removed.</p>
</body>
</html>
Since we’re using Thymeleaf template engine to display the custom error page. Add the Thymeleaf dependency in the pom.xml:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> <version>2.1.8.RELEASE</version> </dependency>
3. Disabling the Whitelabel Error Page
By setting the server.error.whitelabel.enabled property to false
in the application.properties file, we can disable the white label error page.
application.properties
#Disable Whitelabel Error Page
server.error.whitelabel.enabled = false
Note: Add the right property matched with Spring Boot version:
Spring Boot Version >= 1.3 then use
server.error.whitelabel.enabled
= falseSpring Boot Version <= 1.2 then use
error.whitelabel.enabled
= false
We can achieve the same result by excluding the ErrorMvcAutoConfiguration
class to the main class:
Main.java
@SpringBootApplication(exclude = { ErrorMvcAutoConfiguration.class })
public class Main {
public static void main(String[] args) {
SpringApplication.run(WhitelabelErrorPageApplication.class, args);
}
}
References
- Customize the ‘whitelabel’ Error Page
- Custom Error Pages
1. Introduction
When using springboot mvc , you may encounter this error:
You visit: http://localhost:8080/ , it should ok, but the browser display an error page like this:
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
2. Environments
- SpringBoot 1.x and 2.x
- Java 1.8+
- Maven 3.3+
3. How to replay this error?
3.1 The project layout
I have a springboot project , just for test the springboot and mvc:
It’s very simple.
3.2 The problem
when I run it, and visit http://localhost:8080, I got this:
4. How to debug this problem?
Just search the keywords Whitelabel Error Page from the spring project at github , you can get to the ErrorMvcAutoConfiguration, which has this code:
@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(prefix = "server.error.whitelabel", name = "enabled",matchIfMissing = true) //notice this line
@Conditional(ErrorTemplateMissingCondition.class)
protected static class WhitelabelErrorViewConfiguration {...
Notice the @ConditionalOnProperty annotation, it means that:
- If server.error.whitelabel.enabled is not defined,condition match
- Else if server.error.whitelabel.enabled is true,condition match
5. How to solve this problem?
5.1 Disable whitelabel error page with property
According to the above inspection of the spring source code, the solution to hide the Whitelabel Error Page is :
In your src/main/resources/application.properties, just add this line:
server.error.whitelabel.enabled=false
5.2 Disable whitelabel error page with annotation
You can see that the WhitelabelErrorViewConfiguration class is loaded by ErrorMvcAutoConfiguration, which is a @Configuration class, so ,you can exclude it in your springboot main class like this:
@SpringBootApplication(exclude = {ErrorMvcAutoConfiguration.class})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
6. Summary
The WhiteLabel Error Page issue is a nightmare for newbies of springboot. After reading this article, you can find that the key point is to find why spring show this page and where the code is, and then the solution is simple.
- Use custom static html error page to replace springboot whitelabel error page