В моем приложении Spring Boot (2.3.1.RELEASE
) я обслуживаю stati c ресурсы, используя:
@Configuration
public class StaticResourceConfiguration implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/favicon.ico").addResourceLocations("classpath:/static/favicon.ico");
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
}
Это отлично работает. Но я не могу правильно управлять ресурсом stati c , который не найден . Я хочу, чтобы в этом случае вызывался специальный обработчик.
Моя текущая стратегия в моем приложении - управлять всеми исключениями в одном методе. Вот что я сейчас делаю:
@ControllerAdvice
@RestController
public class AppErrorController implements ErrorController {
@Autowired
private ErrorAttributes errorAttributes;
@Override
public String getErrorPath() {
return "/error";
}
@ExceptionHandler(Exception.class)
@RequestMapping("/error")
public ErrorResponse handleError(WebRequest webRequest, HttpServletRequest request, HttpServletResponse response) {
// Get access to the actual Exception
Throwable ex = this.errorAttributes.getError(webRequest);
// Check if it is a 404 exception
if (ex != null && instanceof NoHandlerFoundException) {
// Manage the error as a 404!
// ...
} else {
response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
ErrorResponse errorResponse = new ErrorResponse("generalError", "An error occured");
return errorResponse;
}
}
}
Это работает хорошо, за исключением одного случая: когда ресурс stati c не найден! Затем Spring вызывает метод handleError
из-за @RequestMapping("/error")
, но в этом случае исключение, возвращаемое this.errorAttributes.getError(webRequest)
, будет null
! Поэтому я не могу знать, что это на самом деле 404 , и поэтому мой код возвращает общую ошибку 500.
Как я могу обработать запрос к несуществующему stati c ресурс и иметь возможность определить причину, чтобы я мог вернуть 404 вместо 500?
EDIT :
Я использую эти конфигурации в application.properties
:
spring.resources.add-mappings=false
spring.mvc.throw-exception-if-no-handler-found=true