Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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
Spring 请求映射转换异常_Spring_Spring Mvc - Fatal编程技术网

Spring 请求映射转换异常

Spring 请求映射转换异常,spring,spring-mvc,Spring,Spring Mvc,我有一个SpringRequestMapping,它采用JSON结构并将其转换为POJO。如果我发送一个格式错误的JSON结构的路由,我会收到一个“400错误请求”,但我希望收到的是一条错误消息,说明这是一个错误请求的原因。我有一个验证器也在检查JSON结构,但是如果结构无法转换,它似乎不会被调用。是否有一种方法可以访问内置的HttpMessageConverter错误或异常?我认为您可以通过重写handleHttpMessageEndable方法来使用 发件人:: 如果您希望通过@Except

我有一个SpringRequestMapping,它采用JSON结构并将其转换为POJO。如果我发送一个格式错误的JSON结构的路由,我会收到一个“400错误请求”,但我希望收到的是一条错误消息,说明这是一个错误请求的原因。我有一个验证器也在检查JSON结构,但是如果结构无法转换,它似乎不会被调用。是否有一种方法可以访问内置的HttpMessageConverter错误或异常?

我认为您可以通过重写
handleHttpMessageEndable
方法来使用

发件人::

如果您希望通过@ExceptionHandler方法写入错误内容,则可以扩展ResponseEntityExceptionHandler。这是@ControllerAdvice类提供@ExceptionHandler方法来处理标准Spring MVC异常和返回ResponseEntity的方便基础。这允许您使用消息转换器自定义响应和写入错误内容。有关更多详细信息,请参阅ResponseEntityExceptionHandler javadocs

ResponseEntityExceptionHandler
的示例用法如下:

否则,您可以在此处找到更多spring mvc异常处理方法:


如果您的需求不太复杂,您可能只想使用一个

响应TityExceptionHandler用于识别SpringMVC特定的异常,并为它们实施一个常见的错误响应处理策略

它包括许多方法,例如:

  • handleMissingServletRequestParameter>handle if invalid requestparams
  • handleHttpMessageNotReadable>处理无效的请求正文
  • handleExceptionInternal>A单个位置自定义所有异常类型的响应主体
  • 下面提到的代码重写了handleExceptionInternal方法

    @ControllerAdvice
    public class JavaWebExeptionHandler extends ResponseEntityExceptionHandler {
        public class ExpnDetails {
            public int expnCode;
            public String expnMessage;
        }
    
        // A single place to customize the response body of all exception types.
        @Override
        protected ResponseEntity<ExpnDetails> handleExceptionInternal(Exception ex, Object body, 
                         HttpHeaders headers,HttpStatus status, WebRequest request) {
            return new ResponseEntity<Object>(new ExpnDetails(status.value(), ex.getMessage()), status);
        }
    }
    

    注意此解决方案还有助于隐藏容器(例如tomcat服务器)的详细信息,以便在请求失败时出现在响应错误中。

    感谢您的回复。我相信这已经让我走上了解决这个问题的正确道路。我向我的控制器添加了一个简单的
    @ExceptionHandler
    ,发现了一些奇怪的东西。当我尝试向路由发送JSON数据时,我得到一个
    javax.servlet.ServletException:无法解析名为“dispatcherServlet”的servlet中名为“group/person”的视图
    。此时,我甚至不确定路由是否接收到格式错误的JSON数据,因为无法找到路由本身。但是,如果我发送一个格式良好的JSON结构,那么该路由将被调用。很高兴听到您正在取得进展。有些事情听起来有点奇怪,如果你发布一个你的问题的简化例子,可以让你看到更多的东西。
    
    {
        "expnCode": 415,
        "expnMessage": "Content type 'application/json1' not supported"
    }
    
    {
        "expnCode": 400,
        "expnMessage": "JSON parse error: Unexpected character ('"
        ' (code 34)): was expecting comma to separate Object entries; nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('
        "' (code 34)): was expecting comma to separate Object entries at [Source: (PushbackInputStream); line: 3, column: 4]"
    }