Как вернуть пользовательское сообщение об ошибке при загрузке Spring для страницы / error

#java #spring-boot #thymeleaf #microservices #custom-error-pages

#java #spring-boot #thymeleaf #микросервисы #пользовательские страницы ошибок

Вопрос:

У меня есть проект spring boot и некоторый пользовательский интерфейс с thymeleaf. Я разработал страницу /error вместо ошибки белого уровня, и она работает так, как ожидалось. Однако мне нужно передать некоторую строку в /error и отобразить эту строку на странице ошибок. Мне интересно, как это сделать.

Это моя страница /error :

 <!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Error Occurred.</title>
<link rel="stylesheet" type="text/css" th:href="@{/css/styles.css}">
</head>

<body>    
    <th:block th:include="/_header"></th:block>
    <th:block th:include="/menu"></th:block>

    <div class="page-title">Error!</div>
    <h3 style="color: red;">Sorry! Something went wrong !</h3>    
</body>
</html>
  

Метод ошибки :

 @RequestMapping("/error")
public String error() {
    logger.info("Error Page called...");
    return "error";
}
  

Вместо сообщения об ошибке Sorry! Something went wrong ! я хочу отправить что-то конкретное от вызывающего абонента. Как это сделать.

Комментарии:

1. На самом деле вы обычно не вызываете обработчик ошибок. Можете ли вы более подробно объяснить, что вы пытаетесь сделать? (Обратите внимание, что Spring Boot уже имеет некоторую волшебную поддержку для предоставления ваших собственных шаблонов; смотрите BasicErrorController Подробности.)

2. @chrylis-осторожно оптимистично — Мое основное требование заключается в том, что всякий раз, когда страница с ошибкой вызывается из-за некоторых сбоев в каком-либо API, я хочу передать причину сбоя и распечатать ее на своей странице. Просто строка. Вот и все.

Ответ №1:

Вы можете сделать это таким образом

Шаблон

     <!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Error Occurred.</title>
<link rel="stylesheet" type="text/css" th:href="@{/css/styles.css}">
</head>

<body>    
    <th:block th:include="/_header"></th:block>
    <th:block th:include="/menu"></th:block>

    <div class="page-title">Error!</div>
    <h3 style="color: red;" th:text="${errorMsg}">Sorry! Something went wrong !</h3>    
</body>
</html>



//  Controller
 @RequestMapping("/error")
public String error() {
    logger.info("Error Page called...");
    mmodel.addAttribute("errorMsg", "Custom Error Message");
    return "error";

}
  

Ответ №2:

Наконец-то я смог найти простой способ использования redirectAttributes.addFlashAttribute .

Вот мой некоторый метод контроллера, откуда я перенаправляю /error с reason :

 String errorMsg = "Cart is Empty. Add some products to Cart." ;
CustomErrorMessage error = new CustomErrorMessage(errorMsg);
redirectAttributes.addFlashAttribute("errorForm", error);
return "redirect:/error";
  

И вот моя error страница :

     <div class="page-title">
        <h3 style="color: red">Sorry! Something went wrong !</h3>
        <th:block th:if="${errorForm == null}">
            <h4>Go to Home Page : <a th:href="@{/}">Home</a></h4>
        </th:block>
        <th:block th:if="${errorForm != null}">
            <div><ul><li>Error reason : <span th:utext="${errorForm.errorMsg}"></span></li></ul></div>
            <h4>Go to Home Page : <a th:href="@{/}">Home</a></h4>               
        </th:block>
    </div>