gpt4 book ai didi

java - Spring Boot - 处理 NoHandlerFoundException

转载 作者:行者123 更新时间:2023-12-01 14:04:52 40 4
gpt4 key购买 nike

阅读 Spring Reference Guide on how to handle NoHandlerFoundException并发现 Spring 默认设置为 throwExceptionIfNoHandlerFoundfalse .

知道了这一点,我认为将此参数设置为 true 是个好主意。 .

我正在使用 Spring Boot。

这样做了:

MyConfig.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

@SpringBootApplication
public class MyConfig {

public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(MyConfig.class, args);
context.getBean(DispatcherServlet.class).setThrowExceptionIfNoHandlerFound(true);

// ...
}
}

好的,现在 throwExceptionIfNoHandlerFound等于 true .然而,这并没有像预期的那样奏效。 DispatcherServlet继续不扔了 NoHandlerFoundException .这样一来,我就无法处理了。

CustomExceptionHandler.java (这没有用)
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.NoHandlerFoundException;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

@ControllerAdvice
public class CustomExceptionHandler extends ResponseEntityExceptionHandler {

@Override
protected ResponseEntity <Object> handleNoHandlerFoundException(NoHandlerFoundException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
// do my own handle ...

// then, return ...
}

}

经过一番搜索,发现添加了 @EnableWebMvc应该管用。然后,我确实将此注释添加到了我的 CustomExceptionHandler
CustomExceptionHandler.java (这确实有效)
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.NoHandlerFoundException;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

@EnableWebMvc
@ControllerAdvice
public class CustomExceptionHandler extends ResponseEntityExceptionHandler {

@Override
protected ResponseEntity <Object> handleNoHandlerFoundException(NoHandlerFoundException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
// do my own handle ...

// then, return ...
}

}

这样, handle 就起作用了。但是,我正在使用 Spring Boot。 Spring Boot 文档建议,如果我插入 @EnableWebMvc ,我会失去一些 Spring Boot MVC 自动配置功能,因为我会完全控制 Spring MVC。 ( See here )。

"If you want to take complete control of Spring MVC, you can add your own @Configuration annotated with @EnableWebMvc."



我会丢失 Spring MVC 自动配置吗?我的意思是, @EnableWebMvc ,就我而言,它不在 @Configuration 中类(class)。

我的问题是基于这样一个事实,即我不确定上面的代码是如何工作的,我想知道是否有另一种方法可以在不丢失 Spring MVC 自动配置的情况下执行此操作。有人能解释一下吗?

最佳答案

Spring Boot 自动配置会自动添加一个 ResourceHttpRequestHandler处理服务静态资源。默认情况下,此处理程序映射到 /**并且是处理程序链中的最后一项。

这意味着 DispatcherServlet不会扔 NoHandlerFoundException因为它找到了资源处理程序。资源处理程序处理请求并调用 response.sendError(HttpServletResponse.SC_NOT_FOUND) 返回 404。

如果您不想要这种行为,您可以将以下内容添加到您的 application.properties :

spring.mvc.throw-exception-if-no-handler-found=true
spring.resources.add-mappings=false

将配置调度程序 servlet 以抛出异常并告诉 Spring Boot 不要注册资源处理程序。

在您沿着这条路线走得太远之前,您可能需要查看 this section的引用文档,看看以不同的方式处理这些错误是否更好。从您的问题中并不完全清楚您在错误处理程序中实际尝试做什么,但如果它只是处理 404,那么可能有更好的方法。

关于java - Spring Boot - 处理 NoHandlerFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51048707/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com