У меня есть класс 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);
} }
Если вы использовали 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); возвращение; } Есть ли обходной путь?
ResponseEntityExceptionHandler имеет много методов, которые вы можете предоставить для реализации, один из них - NoHandlerFoundException, полный список: docs.spring.io/spring-framework/docs/current/javadoc-api/org /…. Попробуйте также установить spring.resources.add-mappings = false
См. stackoverflow.com/questions/23574869/…