我收到意外错误java.io.IOException: Stream closed
错误从这一行开始
public void createPo(String username, PurchaseOrderDto po, List<PoItemDto> items) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("poDto", po);
params.put("items", items);
rc.post(String.format("/po?username=%s", username), params);
}
rc
是从另一个服务器调用api的其余客户端。这是其发布功能的代码protected void post(String path, Object object) {
restTemplate.postForObject((url + path), object, Void.class);
}
以下是处理上述请求的api
PoController.java
@ResponseStatus(HttpStatus.OK)
@RequestMapping(value = "/po", method = RequestMethod.POST)
public void createPo(@RequestParam("username") String buyerId, @RequestBody PurchaseOrderDto poDto, @RequestBody List<PoItemDto> items) {
poService.createPo(buyerId, poDto, items);
}
来自处理请求的tomcat服务器的日志:
[http-bio-9080-exec-6] ERROR ib.pms.controller.PoController - Stream closed java.io.IOException: Stream closed
at org.apache.catalina.connector.InputBuffer.readByte(InputBuffer.java:301)
at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:106)
at java.io.FilterInputStream.read(FilterInputStream.java:83)
at java.io.PushbackInputStream.read(PushbackInputStream.java:139)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:168)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:105)
我对此毫无意义。
有没有更干净的方法可以将参数传递给restApi?
最佳答案
您有两个@RequestBody
,这是不可能的,您应该有一个包含Foo
的对象PurchaseOrderDto po, List<PoItemDto> items
(实现Serializable),然后在Foo
中传递restTemplate.postForObject
。
因此,您的控制器必须更改为以下内容:
@ResponseStatus(HttpStatus.OK)
@RequestMapping(value = "/po", method = RequestMethod.POST)
public void createPo(@RequestParam("username") String buyerId, @RequestBody Foo foo) {
poService.createPo(buyerId, foo.getDoDto(), foo.getItems());
}
我不确定这是否可以解决您的问题,但至少少了一个问题
如果要发送多个对象,仍然可以使用列表:
@RequestBody List<Foo> foos