404 Исключение не обрабатывается в Spring ControllerAdvice - PullRequest
0 голосов
/ 09 января 2019

У меня есть простое приложение Spring MVC, в котором я хочу обработать все несопоставленные URL, используя @ControllerAdvice. Вот контроллер:

@ControllerAdvice
public class ExceptionHandlerController {
    @ResponseStatus(HttpStatus.NOT_FOUND)
    @ExceptionHandler(NoHandlerFoundException.class)
    public String handle404() {
        return "exceptions/404page";
    }
}

Тем не менее, каждый раз получайте страницу ошибки Whitelabel.

Я пытался использовать RuntimeException.class, HttpStatus.BAD_REQUEST и расширять класс с помощью NoHandlerFoundException, но безрезультатно.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Другой способ сделать это - ErrorController

@Controller
public class MyErrorController implements ErrorController {

    @GetMapping("/error")
    public ModelAndView errorHandler(HttpServletRequest req) {
        // Get status code to determine which view should be returned
        Object statusCode = req.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
        // In this case, status code will be shown in a view
        ModelAndView mav = new ModelAndView("error_default");
        mav.addObject("code", statusCode.toString());
        return mav;
    }

    public String getErrorPath() {
        return "/error";
    }
}
0 голосов
/ 09 января 2019

Чтобы это работало, вам нужно установить свойство throwExceptionIfNoHandlerFound в DispecherServlet. Вы можете сделать это с помощью:

spring.mvc.throwExceptionIfNoHandlerFound=true

в application.properties файле, в противном случае запросы всегда будут перенаправляться сервлету по умолчанию, а исключение NoHandlerFoundException будет выдано.

Проблема в том, что даже при такой конфигурации она не работает. Из документации:

Обратите внимание, что если org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler is используется, тогда запросы всегда будут перенаправлены на сервлет по умолчанию и NoHandlerFoundException никогда не будет выброшено в этом случае.

Поскольку Spring Boot по умолчанию использует org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler, вам придется переопределить его, используя собственный WebMvcConfigurer:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        // Do nothing instead of configurer.enable();
    }
} 

Конечно, приведенный выше класс может быть более сложным в вашем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...