[英]Producing application/octet-stream and application/json
我有一个端点,它通常返回 PDF、Word 等类型的文档。有用户输入与该端点一起出现,但是我想验证它。
问题是,当我验证输入并想要返回某种错误 JSON 响应时,我最终会收到类似于以下内容的错误
Failed executing GET /foo/generateBar: NoMessageBodyWriterFoundFailure: Could not find MessageBodyWriter for response object of type: FooResponse of media type: application/octet-stream
我在端点上使用的是@Produces({"application/octet-stream", "application/json"})
有没有一种方法可以通过返回 JSON 和不同的文件格式来避免这个错误? 我的印象是我使用的@Produces
正在做什么,但我可能非常困惑。
此外,我必须注意,我在前端使用window.open
来调用此端点。
在Java
和javax.ws.rs.core.Response
中,您应该在标头中尝试这样的操作:
Response.status(response.getStatus())
.header("Accept", "application/json")
.header("Content-type", "application/json")
.entity(entity)
.build();
为了解决这个问题,你必须考虑以下几个方面:
异常管理
在这里,您必须考虑每次遇到任何异常时都会抛出自定义异常,并且异常处理程序将使用@ControllerAdvice
或任何其他解决方案实现。 此异常处理程序将以 JSON 格式返回响应。
处理以返回application/octet-stream
对于端点,您需要提及它将产生application/octet-stream
。 您可以使用: @GetMapping(produces = {MediaType.APPLICATION_OCTET_STREAM})
。
向 GET 请求提供正确的标头
当您调用生成application/octet-stream
的端点时,您将添加值为application/octet-stream, application/json
的Accept
标头。 现在,如果成功,您将收到八位字节流,如果出现任何异常,您将收到 JSON 响应。
我希望这个解决方案能帮助你!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.