Как передать детали ошибки в модель при создании настраиваемого обработчика ошибок?

Хотя возможно, что это связано с несоответствием пути к классам между временем компиляции и временем выполнения, это не обязательно верно.

Важно сохранить два или три разных исключения прямо в нашей голове в этот случай:

  1. java.lang.ClassNotFoundException Это исключение указывает, что класс не найден в пути к классам. Это указывает на то, что мы пытались загрузить определение класса, и класс не существовал в пути к классам.
  2. java.lang.NoClassDefFoundError Это исключение указывает, что JVM посмотрел в своей внутренней структуре данных определения класса для определения класс и не нашел его. Это отличается от того, что он не может быть загружен из пути к классам. Обычно это указывает на то, что мы ранее пытались загрузить класс из пути к классам, но по какой-то причине он потерпел неудачу - теперь мы снова пытаемся использовать этот класс (и, следовательно, необходимо загрузить его, поскольку он провалился в последний раз) я даже не попытаюсь загрузить его, потому что мы не выполнили его загрузку ранее (и разумно подозреваем, что мы снова потерпим неудачу). Ранним отказом может быть исключение ClassNotFoundException или ExceptionInInitializerError (указывающее на отказ в статическом блоке инициализации) или любое количество других проблем. Дело в том, что NoClassDefFoundError не обязательно является проблемой класса.
1
задан Magno C 13 July 2018 в 12:21
поделиться

1 ответ

Вам нужно использовать ErrorAttributes , который "предоставляет доступ к атрибутам ошибки, которые могут быть зарегистрированы или представлены пользователю" .

Возьмите посмотрите:

Основные функции:

import org.springframework.boot.web.servlet.error.ErrorAttributes;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.context.request.WebRequest;

@Controller
public class ErrorHandler implements ErrorController {

   private final ErrorAttributes errorAttributes;

   public ErrorHandler(ErrorAttributes errorAttributes) {
      this.errorAttributes = errorAttributes;
   }

   @GetMapping("/error")
   public String handleError(Model model, WebRequest webRequest) {
      model.addAttribute("midasLocation", "xxx");
      final Throwable error = errorAttributes.getError(webRequest);
      model.addAttribute("exception", error);
      model.addAttribute("message", error == null ? "" : error.getMessage());
      return "error";
   }

   @Override public String getErrorPath() {
      return "/error";
   }

   @GetMapping("/throwErrorForTest")
   public String throwError() {
      throw new RuntimeException("my exception");
   }
}
1
ответ дан Andrei Damian-Fekete 17 August 2018 в 12:54
поделиться
  • 1
  • 2
    @Magno C, Spring рекомендует использовать инъекцию конструктора (например, Оливер Гирке - Почему полевая инъекция является злой ). В модульных тестах вам может понадобиться использовать полевую инъекцию. – Andrei Damian-Fekete 14 July 2018 в 06:45
  • 3
    Не работает, пока я не сделаю инъекцию ... – Magno C 14 July 2018 в 19:33
  • 4
    Аннотируйте свой конструктор с помощью @Autowired (хотя он должен работать без). Код, который я опубликовал, работает с Spring Boot 2, у вас может быть другая настройка. – Andrei Damian-Fekete 15 July 2018 в 10:17
  • 5
    Да. Я должен согласиться. Очень хорошие моменты для рассмотрения в сообщении, которое вы связали. Благодарю. Его хорошо узнать что-то новое. – Magno C 15 July 2018 в 15:42
Другие вопросы по тегам:

Похожие вопросы: