Java Spring启动-处理NoHandlerFoundException

Java Spring启动-处理NoHandlerFoundException,java,spring,spring-mvc,spring-boot,Java,Spring,Spring Mvc,Spring Boot,阅读并发现弹簧在默认情况下通过ExceptionIfNoHandlerFound设置为false 知道了这一点,我认为将此参数设置为true是个好主意 我用的是弹簧靴 他这样做: MyConfig.java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework

阅读并发现弹簧在默认情况下通过ExceptionIfNoHandlerFound设置为
false

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

我用的是弹簧靴

他这样做:

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);

        // ...
    }
}
好的,现在通过ExceptionIfNoHandlerFound等于
true
。然而,这并没有达到预期效果。
DispatcherServlet
继续没有抛出
NoHandlerFoundException
。这样,我无法处理它

CustomExceptionHandler.java(这不起作用)

这样,手柄就可以工作了。但是,我使用的是Spring Boot。Spring Boot文档建议,如果我插入
@EnableWebMvc
,我将失去一些Spring Boot MVC自动配置功能,因为我将完全控制Spring MVC。()

“如果您想完全控制Spring MVC,可以添加自己的@Configuration,并用@EnableWebMvc注释。”

我会失去Spring MVC自动配置吗?我的意思是,
@EnableWebMvc
,在我的例子中,它不在
@Configuration
类中


我的问题是基于这样一个事实,我不确定上面的代码是如何工作的,我想知道是否有其他方法可以做到这一点而不丢失SpringMVC自动配置。有人能解释一下吗?

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

这意味着
DispatcherServlet
不会抛出
NoHandlerFoundException
,因为它找到了资源处理程序。资源处理程序处理请求并调用以返回404

如果不希望出现这种行为,可以将以下内容添加到
应用程序.properties

spring.mvc.throw-exception-if-no-handler-found=true
spring.resources.add-mappings=false
将配置DispatcherServlet以引发异常,并告诉SpringBoot不要注册资源处理程序


在您走得太远之前,您可能希望查看参考文档的列表,看看以不同的方式处理这些错误是否更好。您的问题并不完全清楚您在错误处理程序中实际要做什么,但如果只是处理404,那么可能有更好的方法。

谢谢您,Phil。对于SpringBoot2.3,包含这些属性没有任何效果。例如,在实现了
ResponseEntityExceptionHandler#handleHttpRequestMethodNotSupported
之后,
DispatcherServlet
将带有不受支持的HTTP方法的请求发送到
/error
而不是此处理程序。问题是,
ErrorController
是容器范围的,因此如果我有多个控制器,每个控制器在出现错误时都需要发送不同的JSON消息(特定于这些控制器),那么我就处于绑定状态,必须求助于转发URI检查。为什么春天会这样?
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 ...
    }

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