可以同时拥有Spring @RequestBody和HttpEntity吗?

时间:2018-06-17 04:06:17

标签: java spring spring-restcontroller spring-boot-actuator

我在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,但我不想手动执行此操作。

这可能吗?

1 个答案:

答案 0 :(得分:0)

您无法同时阅读HttpEntity的正文并使用@RequestBody的原因是,它们都从HttpRequest的{​​{1}}读取并在之后关闭它。由于您在InputStream关闭后无法再次阅读,因此最后一次操作失败,如您所见。

您真正想要的是访问一些未在InputStream类中映射的属性,特别是访问使用Command属性指定的类。 您可以使用Jackson的type@JsonTypeInfo注释来执行此操作,这样可以自定义类层次结构的反序列化。