如何创建 Java API 来传递来自另一个源的 json 行流

问题描述 投票:0回答:1

我想创建一个 Java Spring Boot 项目,为客户端提供 REST API。对 API 的请求将被转发(经过一些更改)到数据库。我想收到数据库的响应并将其转发给客户端。

我知道如何针对一个简单的请求执行此操作,从数据库中获取单个结果。但是数据库返回 json 行流,我想将其作为流直接传递给客户端。所以我不想收集流直到它结束(将其存储在内存中)然后将其发送到客户端。我可能还想对每个 json 行应用一些转换或过滤。存储几行作为缓存的缓冲区就可以了。

java json spring stream
1个回答
0
投票

如果我理解正确,你想从

ResultSet
一次返回一行 - Spring Boot 提供了多种机制来执行此操作,请参阅 - https://www.baeldung.com/spring-mvc-sse-streams

一个使用

StreamingResponseBody
的简单示例可能类似于:

@Controller
public class SomeController
{
  @GetMapping
  public ResponseEntity<StreamingResponseBody> handleGet(@RequestParam("someParam") int someParam) 
  {
    return new ResponseEntity(query(someParam), HttpStatus.OK);
  }

  private StreamingResponseBody query(int someParam)
  {
    return out -> 
    {
      out.write((byte)'[');

      try (
        var preparedStatement = prepareStatement(someParam);
        var resultSet = preparedStatement.executeQuery()
      )
      {
         while (resultSet.next())
         {
            out.write(resultSet.getBytes("some_column_containing_json")); 
            if (!resultSet.isLast()) out.write((byte)',');
         }
      }
      finally
      {
        out.write((byte)']');
      }
    };
  }

  private PreparedStatement prepareStatement(int someParam)
  {
     var preparedStatement = connection.prepareStatement("SELECT some_column FROM some_table WHERE some_other_column = ?");
     preparedStatement.setInt(1, someParam);

     return preparedStatement;
  }
}

这假设您希望将 JSON 行作为 JSON 数组返回。

© www.soinside.com 2019 - 2024. All rights reserved.