Spring Boot 404错误页面没有找到

ygya80vv  于 2022-12-18  发布在  Spring
关注(0)|答案(3)|浏览(126)

我有一个简单的Spring MVC应用程序,我想在其中使用@ControllerAdvice处理所有未Map的url。

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

尽管如此,每次都得到白标错误页。
我尝试使用RuntimeException.classHttpStatus.BAD_REQUEST并使用NoHandlerFoundException扩展类,但没有使用。
有什么建议吗?

goqiplq2

goqiplq21#

要使其工作,您需要设置DispecherServlet上的throwExceptionIfNoHandlerFound属性。您可以使用以下命令来完成此操作:

spring.mvc.throwExceptionIfNoHandlerFound=true

application.properties文件中,否则请求将始终被转发到默认servlet,并且将抛出NoHandlerFoundException。
问题是,即使使用这种配置,它也不起作用。
请注意,如果使用org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,那么请求将始终被转发到默认的servlet,并且在这种情况下不会抛出NoHandlerFoundException。
由于Sping 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();
    }
}

当然,在您的情况下,上面的类可能会更加复杂。

f8rj6qna

f8rj6qna2#

另一种方法是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";
    }
}
11dmarpk

11dmarpk3#

application.properties中添加以下行
如果未找到处理程序则抛出异常=真
和**@启用WebMvc**(带有**@控制器建议**),注意:在handleNoHandlerFoundException方法上添加@Override,这对我很有效!

@EnableWebMvc
@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
    @Override
    protected ResponseEntity<Object> handleNoHandlerFoundException(NoHandlerFoundException ex, HttpHeaders headers,
            HttpStatus status, WebRequest request) {
        CustomResponse response = new CustomResponse();
        response.setTimestamp(LocalDateTime.now());
        response.setMessage(ApplicationErrorCodes.NO_HANDLER_FOUND.getErrorMessage());
        response.setStatus(HttpStatus.BAD_REQUEST);
        response.setErrorCode(ApplicationErrorCodes.NO_HANDLER_FOUND.getErrorCode());
        return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
    }
}

相关问题