未调用spring boot的异常处理程序方法

未调用spring boot的异常处理程序方法,spring,spring-boot,Spring,Spring Boot,我正在使用spring启动应用程序。任何人都可以建议,为什么不调用异常处理程序方法?当我将异常处理程序方法添加到控制器本身时,它工作正常。只需使用这样一个简单的类即可 2020-01-27 19:16:34,708 INFO [http-nio-8080-exec-1] [] [] [] org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet

我正在使用spring启动应用程序。任何人都可以建议,为什么不调用异常处理程序方法?当我将异常处理程序方法添加到控制器本身时,它工作正常。

只需使用这样一个简单的类即可

2020-01-27 19:16:34,708 INFO  [http-nio-8080-exec-1] [] [] [] org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-01-27 19:16:34,713 INFO  [http-nio-8080-exec-1] [] [] [] org.springframework.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2020-01-27 19:16:34,748 INFO  [http-nio-8080-exec-1] [] [] [] org.springframework.web.servlet.DispatcherServlet : Completed initialization in 34 ms
2020-01-27 19:16:34,893 ERROR [http-nio-8080-exec-1] [] [LOCAL] [] com.mckesson.lib.spring.controller.RestController : Failed to process the request
com.mckesson.ms.template.v1.exception.OrgIdException: exception thrown.....
    at com.mckesson.ms.template.v1.endpoint.SampleEndpoint.doBadRequest(SampleEndpoint.java:32) ~[main/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_221]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_221]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_221]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_221]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:189) ~[spring-web-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) ~[spring-webmvc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800) ~[spring-webmvc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038) ~[spring-webmvc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942) ~[spring-webmvc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005) [spring-webmvc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897) [spring-webmvc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:645) [javax.servlet-api-4.0.1.jar:4.0.1]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882) [spring-webmvc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:750) [javax.servlet-api-4.0.1.jar:4.0.1]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [tomcat-embed-core-9.0.16.jar:9.0.16]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.16.jar:9.0.16]
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) [tomcat-embed-websocket-9.0.16.jar:9.0.16]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.16.jar:9.0.16]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.16.jar:9.0.16]

可以创建一个全局异常处理程序,以通过区段响应EntityExceptionHandler处理http异常

@ControllerAdvice
public class MyControllerAdvice {
    @ResponseBody
    @ExceptionHandler(OrgIdException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public GeneralExceptionResponse handlePersonNotFound(OrgIdException ex) {
        return new GeneralExceptionResponse("-1", ex.getMessage());
    }
}
@ControllerAdvice
公共类GlobalExceptionHandler扩展了ResponseEntityExceptionHandler{
@凌驾
受保护响应handleMethodArgumentNotValid无效(MethodArgumentNotValidException ex,
HttpHeaders和headers,
HttpStatus状态,
WebRequest(请求){
映射体=新LinkedHashMap();
body.put(“timestamp”,newdate());
body.put(“status”,status.value());
//获取所有错误
列表错误=例如getBindingResult()
.getFieldErrors()
.stream()
.map(x->x.getDefaultMessage())
.collect(Collectors.toList());
正文。put(“错误”,错误);
返回新的响应属性(正文、标题、状态);
}

确保您的自定义建议位于
@SpringBootApplication
或其他
@ComponentScan
所涵盖的包中。是的,正在扫描自定义异常处理程序。我已验证for(字符串名:applicationContext.getBeanDefinitionNames()){System.out.println(name);}Remove
在控制器上引发异常
,这允许您不捕获异常。
@ControllerAdvice
public class MyControllerAdvice {
    @ResponseBody
    @ExceptionHandler(OrgIdException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public GeneralExceptionResponse handlePersonNotFound(OrgIdException ex) {
        return new GeneralExceptionResponse("-1", ex.getMessage());
    }
}
@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
  @Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
                         HttpHeaders headers,
                         HttpStatus status, 
                         WebRequest request) {
        Map<String, Object> body = new LinkedHashMap<>();
        body.put("timestamp", new Date());
        body.put("status", status.value());

        //Get all errors
        List<String> errors = ex.getBindingResult()
                .getFieldErrors()
                .stream()
                .map(x -> x.getDefaultMessage())
                .collect(Collectors.toList());

        body.put("errors", errors);

        return new ResponseEntity<>(body, headers, status);
    }