Создание настраиваемого исключения для ресурса не найден 404 spring boot

У меня есть класс CustomResponseEntityExceptionHandler, расширяющий ResponseEntityExceptionHandler двумя методами: один для обработки неправильных форматов, а другой - когда ресурс (URL) запрашивается, но не существует. Я хотел бы предоставить пользователю настраиваемое сообщение вместо страницы ошибок White Label по умолчанию в Spring. Я пытаюсь понять, почему мой метод handleResourceNotFoundException из CustomResponseEntityExceptionHandler не вызывается, когда запрашивается несуществующий URI, но вместо этого у меня остается страница ошибок White Label. Спасибо за вашу помощь!

curl localhost:8080/doesnotexist

Это мой CustomResponseEntityExceptionHandler

@ExceptionHandler(Exception.class)
public final ResponseEntity<ErrorDetails> handleAllWrongFormatExceptions(WrongFormatException ex,
        WebRequest request) {
    ErrorDetails errorDetails = new ErrorDetails(new Date(), ex.getMessage(), request.getDescription(true));
    return new ResponseEntity<>(errorDetails, HttpStatus.INTERNAL_SERVER_ERROR);
}

@ExceptionHandler(ResourceNotFoundException.class)
public final ResponseEntity<ErrorDetails> handleResourceNotFoundException(ResourceNotFoundException ex,
        WebRequest request) {
    ErrorDetails errorDetails = new ErrorDetails(new Date(), ex.getMessage(), request.getDescription(false));
    return new ResponseEntity<>(errorDetails, HttpStatus.NOT_FOUND);
}

Простой класс для хранения сведений об ошибках

public class ErrorDetails {

private Date timestamp;
private String message;
private String details;

public ErrorDetails(Date timestamp, String message, String details) {

    this.timestamp = timestamp;
    this.message = message;
    this.details = details;
}

public Date getTimestamp() {
    return timestamp;
}

public String getMessage() {
    return message;
}

public String getDetails() {
    return details;
} }

А вот и мой контроллер

@Controller
public class StringManipController {

@Autowired
private StringProcessingService stringProcessingService;

@GetMapping("/")
@ExceptionHandler(ResourceNotFoundException.class)
@ResponseBody
public String home(@RequestParam(name = "value", required = false, defaultValue = "") String value) {

    return "Welcome to the String Processing Application";
}

@GetMapping("/stringDedup")
@ResponseBody
public ProcessedString doManip(@RequestParam(name = "value", required = false, defaultValue = "") String value) {

    String result = stringProcessingService.getStringManipulation(value);

    return new ProcessedString(result);

}

@GetMapping("/writeNumber")
@ResponseBody
public ProcessedString getWriteNumber(
        @RequestParam(name = "value", required = false, defaultValue = "") String value) {

    String number = stringProcessingService.getNumberToWords(value);

    return new ProcessedString(number);

} }

А вот и ResourceNotFoundException class

    @ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {


    private static final long serialVersionUID = 266853955330077478L;

    public ResourceNotFoundException(String exception) {
        super(exception);
    } }

См. stackoverflow.com/questions/23574869/…

user10527814 31.10.2018 14:34
0
1
4 433
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы использовали Spring Boot:

@ControllerAdvice
public class CustomResponseEntityExceptionHandler {

    @ExceptionHandler(value = { NoHandlerFoundException.class })
    public ResponseEntity<Object> noHandlerFoundException(Exception ex) {

        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("test");
    }
}

или

@ControllerAdvice
public class CustomResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {

    @Override
    protected ResponseEntity<Object> handleNoHandlerFoundException(
            NoHandlerFoundException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {

        return handleExceptionInternal(ex, "Test", headers, status, request);
    }
}

В классе org.springframework.web.servlet.DispatcherServlet есть переменная throwExceptionIfNoHandlerFound. Если установлено значение true, метод с именем noHandlerFound выдаст NoHandlerFoundException. Ваш обработчик исключений теперь его поймает.

Добавьте это свойство в свой файл application.properties: spring.mvc.throw-exception-if-no-handler-found=true

Я использую spring boot 2. В моем случае это не выход. ResourceHttpRequestHandler запускается раньше и выполняет следующее if (resource == null) {logger.debug («Resource not found»); response.sendError (HttpServletResponse.SC_NOT_FOUND); возвращение; } Есть ли обходной путь?

Tioma 31.10.2019 12:05

ResponseEntityExceptionHandler имеет много методов, которые вы можете предоставить для реализации, один из них - NoHandlerFoundException, полный список: docs.spring.io/spring-framework/docs/current/javadoc-api/org‌ /…. Попробуйте также установить spring.resources.add-mappings = false

David Araujo 04.11.2019 14:04

Другие вопросы по теме