Spring使用一个称为的接口
HandlerMethodArgumentResolver来决定将哪些参数传递给您的处理程序方法。对于带有注释的参数
@RequestBody,请使用名为的类
RequestResponseBodyMethodProcessor。此类基本上在一组
HttpMessageConverter对象中查找可以读取
content-type请求的对象并可以转换为指定类型的对象。如果找到一个,则将
HttpServletRequestas
的主体传递
InputStream给该
HttpMessageConverter对象。
在这种情况下,您可能会发现一些JSON解串器正在工作。很可能(看到
IOException您得到的)消耗流然后关闭它。
因此,实际上,这种做事方式并非直接可行。
一种解决方案是制作一个
Filter,将封装
HttpServletRequest在您自己的实现中,该实现对进行缓冲,
InputStream以使其可重复使用/重新读取所需次数。但是同样,Spring可能会采用从身体反序列化的规则,而这并不是您真正想要的。在这种情况下,你可以创建自己的
Annotation,并
HandlerMethodArgumentResolver通过它来与您的配置应用程序注册。然后,您可以控制从请求主体反序列化事物的方式。
另一个解决方案是两者结合起来
MyObjectDto,并
messageBody成一个DTO,如果是有道理的,以数据模型(和spring反序列化过程)。



