当前位置: 首页 > 知识库问答 >
问题:

SpringBoot捕获请求体出错

邢曦
2023-03-14

我有一个接受JSON的应用程序。它有一个带有@RestController的控制器,然后是一个

@RequestMapping(value="/junk", method=RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_VALUE)
public MyResponse postInfo(@RequestBody MyRequest info) {
...
}

这“起作用”是因为它接受根据“MyRequest”对象有效的JSON并对其进行处理。我感兴趣的是捕捉JSON无效的时间。

目前,当有不良数据时会发生什么是Spring似乎会向标准输出写入这样的内容:

2017-04-26 13:57:40.621  WARN 13537 --- [pr-8080-exec-13] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Could not read document: Unexpected character ('}' (code 125)): was expecting double-quote to start field name
at [Source: java.io.PushbackInputStream@cc73b4; line: 1, column: 1048800]
at [Source: java.io.PushbackInputStream@cc73b4; line: 1, column: 1048796] (through reference chain: com.junk.ProcessInfo["process_list"]->java.util.ArrayList[4692]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Unexpected character ('}' (code 125)): was expecting double-quote to start field name
at [Source: java.io.PushbackInputStream@cc73b4; line: 1, column: 1048800]
at [Source: java.io.PushbackInputStream@cc73b4; line: 1, column: 1048796] (through reference chain: com.junk.ProcessInfo["process_list"]->java.util.ArrayList[4692])

这一切都很好,但我想看看请求是什么,这是不好的,这样我就可以在源代码端修复它。

我在玩写“ControllerAdvisor”的游戏

@ControllerAdvice(annotations = RestController.class)
public class ControllerAdvisor {

    private static final Logger logger = LogManager.getLogger();

    @ModelAttribute
    public void logBody(HttpServletRequest request, HttpServletResponse response, @RequestBody String requestString) {
        logger.trace("requestString" + requestString);
    }
}

它似乎写出了每个请求的请求体(不仅仅是错误),但当我使用它时,它似乎修改了请求,使得实际控制器将失败

2017-04-26 14:28:31.432  WARN 523 --- [io-8081-exec-29] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public com.junk.MyResponse com.junk.ProcessController.postInfo(com.junk.MyRequest)

我也在玩执行器,但是ctuator.trace实际上并没有给我身体。

有没有办法在我的RestController中获取实际的requestBody?

编辑:这是一个演示行为的完整应用程序:

下载示例

共有1个答案

何承
2023-03-14

从日志中可以看出,您的服务器端实现没有问题。从日志中,我将其解释为您发布了这样的JSON正文:

{
    myPropert: myvalue
}

当需要消息转换器时:

{
    "myPropert": "myvalue"
}
 类似资料:
  • 我正在运行,刚刚检查了服务器日志,并出现了几个类似的错误。我不明白是什么导致了它,因为错误每天都在12/24小时后出现。

  • 问题内容: 我正在尝试构建一个发出ajax请求的Google Chrome扩展程序。与GMail Checker扩展程序类似。问题是,当我使用jquery进行请求时,并输入了错误的用户名/密码时,它会静默失败,并忽略错误回调函数。 如果我将ajax调用从background.html脚本(在开发人员窗口中看不到请求)中移出到options.html脚本中,则会得到一个对话框来重新进行身份验证。如果

  • 我不明白为什么使用RestController注释将类声明为服务,如下所示: 调度员

  • 从我的后端应用程序(springboot,java8)中,我将进行多个外部api调用。我需要将所有请求和响应数据(包括头、请求和响应体)记录到数据库(MongoDB)中。 下面是我的示例代码,这是我如何尝试捕获每个外部api调用的请求和响应。在异常情况下,我将存储状态为“失败”。 在我的项目中,将在新的第三方api集成上添加多个模块,因此在每个模块中,对于每个不同的外部api调用,我必须捕获所有这

  • 问题内容: 我想每次发送ajax请求时显示一个“正在加载”进度栏。是否有可能在任何时候使用jQuery发送ajax请求时收到通知? 问题答案: 您可以使用该方法来设置将应用于整个页面的全局AJAX属性: