我在Spring Boot应用程序中有以下代码:
@RestController
@RequestMapping("/execute")
public class RestCommandExecutor {
@PostMapping
public Response executeCommand(@RequestBody Command command,
HttpEntity<String> httpEntity) {
System.out.println(command);
System.out.println("********* payload is: " + httpEntity.getBody());
return new Response("Hello text", new Long(123));
}
}
如果POST请求带有正确的Command
,我会收到I / O错误:
.w.s.m.s.DefaultHandlerExceptionResolver : Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: I/O error while reading input message; nested exception is java.io.IOException: Stream closed
我希望Spring将请求体转换为Command
,但由于JSON比Command
类的部分更多,我希望得到原始的完整JSON。
有没有办法通过方法中的映射来实现这一点?我知道我可以随时执行此操作public Response executeCommand(HttpEntity<String> httpEntity)
,然后使用Jackson手动将其翻译为Command
,但我不想手动执行此操作。
这可能吗?
答案 0 :(得分:0)
您无法同时阅读HttpEntity
的正文并使用@RequestBody
的原因是,它们都从HttpRequest
的{{1}}读取并在之后关闭它。由于您在InputStream
关闭后无法再次阅读,因此最后一次操作失败,如您所见。
您真正想要的是访问一些未在InputStream
类中映射的属性,特别是访问使用Command
属性指定的类。
您可以使用Jackson的type
和@JsonTypeInfo
注释来执行此操作,这样可以自定义类层次结构的反序列化。