Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ControllerAdvice未处理异常_Java_Rest_Spring Mvc_Exception_Spring Boot - Fatal编程技术网

Java ControllerAdvice未处理异常

Java ControllerAdvice未处理异常,java,rest,spring-mvc,exception,spring-boot,Java,Rest,Spring Mvc,Exception,Spring Boot,我有一个spring boot 1.3.3应用程序。我有一个rest控制器,它在某些情况下抛出异常。将抛出异常并打印消息,但不会激发ControllerAdvice类。以下是我的相关文件: TestController.java @Controller public class TestController { // RESTful method @RequestMapping( value = "/test", method =

我有一个spring boot 1.3.3应用程序。我有一个rest控制器,它在某些情况下抛出异常。将抛出异常并打印消息,但不会激发ControllerAdvice类。以下是我的相关文件: TestController.java

@Controller
public class TestController {
    // RESTful method
    @RequestMapping(
            value = "/test",
            method = RequestMethod.POST,
            consumes = "application/json",
            produces = "application/json")
    @ResponseBody
    public JsonNode fooRestTest(@RequestHeader HttpHeaders header,
            @RequestBody String payload) {
        ControllerUtil.validateHeaders(header);
        return null;
    }
}
@ControllerAdvice
@EnableWebMvc
public class AppErrorController {

    @ExceptionHandler(InvalidHeaderException.class)
    public ModelAndView handleHeaderError(HttpServletRequest req, Exception ex) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", req.getRequestURL());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.addObject("status", 400);
        return mav;
    }
}
ControllerUtil.java

public class ControllerUtil {
    public static void validateHeaders(HttpHeaders headers) {
        if(headers.get("test-field") == null) {
            throw new InvalidHeaderException("Invalid test-field in header");
        }
    }
}
InvalidHeaderException.java

public class InvalidHeaderException extends RuntimeException {


    public InvalidHeaderException(String message) {
        super(message);
    }

    public InvalidHeaderException(String message, Throwable cause) {
        super(message, cause);
    }
}
AppErrorController.java

@Controller
public class TestController {
    // RESTful method
    @RequestMapping(
            value = "/test",
            method = RequestMethod.POST,
            consumes = "application/json",
            produces = "application/json")
    @ResponseBody
    public JsonNode fooRestTest(@RequestHeader HttpHeaders header,
            @RequestBody String payload) {
        ControllerUtil.validateHeaders(header);
        return null;
    }
}
@ControllerAdvice
@EnableWebMvc
public class AppErrorController {

    @ExceptionHandler(InvalidHeaderException.class)
    public ModelAndView handleHeaderError(HttpServletRequest req, Exception ex) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", req.getRequestURL());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.addObject("status", 400);
        return mav;
    }
}
web.xml

<web-app id="RBGApp" version="3.0"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

    <display-name>FooTester</display-name>

    <servlet>
        <servlet-name>Foo_Test</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- Mappings -->
    <servlet-mapping>
        <servlet-name>Foo_Test</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>
我通过邮递员的请求对此进行了测试,它抛出异常并打印出行:

Invalid test-field in header
但是代码根本不会进入
AppErrorController
。因此,不会填充其他值,如
timestamp
。知道我做错了什么吗

编辑1: 这是邮递员的回应:

<html>
    <head>
        <title>Apache Tomcat/7.0.62 - Error report</title>
        <style>
            <!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}-->
        </style> 
    </head>
    <body>
        <h1>HTTP Status 500 - Invalid test-field in header</h1>
        <HR size="1" noshade="noshade">
        <p>
            <b>type</b> Exception report
        </p>
        <p>
            <b>message</b>
            <u>Invalid test-field in header</u>
        </p>
        <p>
            <b>description</b>
            <u>The server encountered an internal error that prevented it from fulfilling this request.</u>
        </p>
        <p>
            <b>exception</b>
            <pre>controllers.exceptions.InvalidHeaderException: Invalid test-field in header
    controllers.util.ControllerUtil.validateHeaders(ControllerUtil.java:12)
    controllers.TestController.fooRestTest(TestController.java:77)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:497)
    org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:814)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:737)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:969)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:871)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:845)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    org.springframework.boot.context.web.ErrorPageFilter.doFilter(ErrorPageFilter.java:120)
    org.springframework.boot.context.web.ErrorPageFilter.access$000(ErrorPageFilter.java:61)
    org.springframework.boot.context.web.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:95)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    org.springframework.boot.context.web.ErrorPageFilter.doFilter(ErrorPageFilter.java:113)
</pre>
        </p>
        <p>
            <b>note</b>
            <u>The full stack trace of the root cause is available in the Apache Tomcat/7.0.62 logs.</u>
        </p>
        <HR size="1" noshade="noshade">
        <h3>Apache Tomcat/7.0.62</h3>
    </body>
</html>

日志文件中是否有类似
java.lang.IllegalStateException:没有合适的参数解析程序的消息

尝试在handleHeaderError方法参数处使用相同的异常类型:InvalidHeaderException而不是exception。像这样:

@ControllerAdvice
@EnableWebMvc
@Order(Ordered.HIGHEST_PRECEDENCE)
public class AppErrorController {

@ExceptionHandler(InvalidHeaderException.class)
public ModelAndView handleHeaderError(HttpServletRequest req, InvalidHeaderException ex) {
    ModelAndView mav = new ModelAndView();
    mav.addObject("exception", ex);
    mav.addObject("url", req.getRequestURL());
    mav.addObject("timestamp", LocalDateTime.now());
    mav.addObject("status", 400);
    return mav;
}

}

可能有其他处理程序正在处理此请求(
,从控制台输出的前5行开始)。这可能在项目的构建路径中的任何jar中

我们需要将处理程序的优先级设置为最高,所以首先要进行控制

我认为在
@EnableWebMvc
之后添加
@Order(Ordered.HIGHEST_priority)
可能会解决这个问题


此外,如果它不起作用,请尝试将
InvalidHeaderException.class
更改为
Exception.class
(不管它是什么异常,控制都会出现在这里)。在您的情况下,调试也会很有帮助。

…您可以添加一个日志语句并再次检查它吗?看起来它的配置很好。更新了我的帖子。正如您所看到的,ControllerAdvice根本不参与此响应。应该有一个时间戳字段,错误代码应该是400。您可以从该控制器中删除
@EnableWebMvc
注释并重试吗。您是否在某个地方(Bitbucket、GitHub、GitLab)有该项目,以便我们查看?此外,您从未设置过
视图名
,不知道它如何知道去哪里…是什么让您认为返回“状态”为400的模型(没有视图)会改变引发某些异常的结果??看,我也试过了,但还是不起作用。我发布了控制台输出。没有抛出
IllegalStateException
@ControllerAdvice
@EnableWebMvc
@Order(Ordered.HIGHEST_PRECEDENCE)
public class AppErrorController {

@ExceptionHandler(InvalidHeaderException.class)
public ModelAndView handleHeaderError(HttpServletRequest req, InvalidHeaderException ex) {
    ModelAndView mav = new ModelAndView();
    mav.addObject("exception", ex);
    mav.addObject("url", req.getRequestURL());
    mav.addObject("timestamp", LocalDateTime.now());
    mav.addObject("status", 400);
    return mav;
}