【问题标题】:Producing application/octet-stream and application/json生成 application/octet-stream 和 application/json
【发布时间】:2018-12-06 22:58:55
【问题描述】:

我有一个端点,该端点通常返回 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 来调用这个端点。

【问题讨论】:

  • 如果您想从返回 JSON 和其他类型响应的端点获取 JSON 响应,您可能需要尝试将 accept: application/json 添加到请求的标头中。
  • @DanielVerem 以编程方式,在实践中我将如何做到这一点?此外,我必须注意 window.open() 在前端被用来调用这个端点。

标签: java json rest jersey jax-rs


【解决方案1】:

Javajavax.ws.rs.core.Response 中,您应该在标题中尝试这样的操作:

               Response.status(response.getStatus())
                       .header("Accept", "application/json")
                       .header("Content-type", "application/json")
                       .entity(entity)
                       .build();

【讨论】:

    【解决方案2】:

    为了解决这个问题,你必须考虑以下几个方面:

    1. 异常管理

      在此您必须考虑到每次遇到任何异常时都会引发自定义异常,并且异常处理程序将使用@ControllerAdvice 或任何其他解决方案实现。此异常处理程序将以 JSON 格式返回响应。

    2. 处理返回 application/octet-stream

      对于端点,你需要提到它会产生application/octet-stream。您可以使用:@GetMapping(produces = {MediaType.APPLICATION_OCTET_STREAM})

    3. 为 GET 请求提供正确的标头

      当您调用产生application/octet-stream 的端点时,您将添加带有值application/octet-stream, application/jsonAccept 标头。现在,如果成功,您将收到八位字节流,如果出现任何异常,您将收到 JSON 响应。

    希望这个解决方案能帮到你!

    【讨论】:

      猜你喜欢
      • 2014-06-08
      • 1970-01-01
      • 2017-05-21
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      相关资源
      最近更新 更多