gpt4 book ai didi

java - 流关闭异常是 RestTemplate Java。如何将多个对象传递给 Java RestClient

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:08:04 26 4
gpt4 key购买 nike

我收到意外错误 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 的其余客户端。这是它的post函数的代码

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然后传递 Foo在你的restTemplate.postForObject .

因此,您的 Controller 必须更改为:

@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

关于java - 流关闭异常是 RestTemplate Java。如何将多个对象传递给 Java RestClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33016836/

26 4 0
文章推荐: java - 如何在 Java 中将 List 转换为 List
文章推荐: java - Do-while 语句 Java