Java springrest巨大的响应导致响应编写器被多次调用

Java springrest巨大的响应导致响应编写器被多次调用,java,spring,Java,Spring,我有一个非常简单的控制器操作,它访问服务层并最终返回一个巨大的响应。响应部分发送,但在随机位置,结果如下所示: …“尺寸”:{“宽度”:400,“高度”:394},“hostedAtS3”:true}, 我得到以下例外情况: java.lang.IllegalStateException:已为此响应调用getOutputStream() 此控制器非常简单: @JsonView(value = StickerPackView.Admin.class) @ApiOperation(value = "

我有一个非常简单的控制器操作,它访问服务层并最终返回一个巨大的响应。响应部分发送,但在随机位置,结果如下所示:

…“尺寸”:{“宽度”:400,“高度”:394},“hostedAtS3”:true},

我得到以下例外情况:

java.lang.IllegalStateException:已为此响应调用getOutputStream()

此控制器非常简单:

@JsonView(value = StickerPackView.Admin.class)
@ApiOperation(value = "[ADMIN] Lists all categories regardless visibility", response = StickerCategory.class)
@RequestMapping(value = "/categories/all", method = RequestMethod.GET)
public ResponseEntity getCategories(Principal principal) {
    return new ResponseEntity(stickerService.getAllCategories(), OK);
}
我尝试的第一件事是让它
delferredresult
Callable
认为生成响应可能需要更长的时间。不幸的是,事实并非如此。当我将该方法留在那里并最终返回一些较小的响应(如单个类别)时,一切正常


我不知道如何处理它。这里是。

检查这是否是对HTTP的一般理解的问题

HTTP的基本规则:一个请求,一个响应。您只能发回 一个请求只有一件事

您提到,当您只发送一个类别时,它可以工作。如果您正在处理大量数据,您的控制器可能会将其作为多个响应进行处理。您提供的代码有限,很难说到底是什么导致了错误


希望这会有所帮助。

所以我做了一些调试,发现它与任何与JSON、长度或类似的内容无关。它是损坏的数据。特定模型中的一个getter基于已为null的数据生成了响应。域模型中最近的更改允许它为null,并且此方法不是Adjust为了找到它,我将我的控制器操作从我的问题修改为:

@JsonView(value = StickerPackView.Admin.class)
@ApiOperation(value = "[ADMIN] Lists all categories regardless visibility", response = StickerCategory.class)
@RequestMapping(value = "/categories/all", method = RequestMethod.GET)
public ResponseEntity getCategories(Principal principal, ObjectMapper mapper) throws JsonProcessingException {
    final Collection<StickerCategory> categories = stickerService.getAllCategories();
    final String s = mapper.writeValueAsString(categories);
    return new ResponseEntity(s.length(), OK);
}
@JsonView(value=tagerpackview.Admin.class)
@ApiOperation(value=“[ADMIN]列出所有类别,不管可见性如何”,response=category.class)
@RequestMapping(value=“/categories/all”,method=RequestMethod.GET)
public ResponseEntity getCategories(主体、对象映射器映射器)抛出JsonProcessingException{
最终收集类别=贴纸服务。getAllCategories();
最终字符串s=mapper.writeValueAsString(类别);
返回新的ResponseEntity(s.length(),OK);
}

通过这种方式,序列化错误并没有隐藏在Spring Json序列化魔术背后,而是向我公开了一切。我在这一点上浪费了太多时间。

好吧。关于控制器,没有太多的东西要展示。这里的例子是需要传输到客户端的数据量。我看到过在一个页面中返回更多数据的服务请求,但事实上-将这个巨大的响应拆分为较小的响应+HATEOA,以帮助实现此api的人员使用漫游资源是一种可以接受的解决方法。