如何在Quarkus应用中读取GraphQL查询结果
解答
一、查询结果的默认存储情况
默认情况下,这个JSON结果不会自动持久化存储。它是Quarkus集成的SmallRye GraphQL框架,在运行时将Java业务对象(Film、Hero实例)序列化成JSON后,通过HTTP响应返回给GraphQL UI的临时数据,不会保存到磁盘、数据库或其他持久化介质中,除非你主动添加存储逻辑。
二、在程序中获取/处理结果的方式
1. 直接获取服务端的原始Java对象(无需序列化)
返回的JSON是从Java对象序列化而来的,你可以在GraphQL方法中直接拿到原始业务对象,包括关联的heroes数据(SmallRye GraphQL会自动触发@Source标记的heroes方法加载关联数据)。
示例:在getFilm方法中直接操作对象
@Query("getFilm") @Description("Get a film by it's id") public Film getFilm(@Name("filmId") int id) { Film film = service.getFilm(id); // 直接操作film对象,比如打印关联英雄数量 System.out.println("关联英雄数量:" + film.heroes.size()); return film; }
2. 将Java对象序列化为JSON字符串
Quarkus自带JSON-B(默认)或Jackson作为序列化工具,你可以将对象转成和UI展示一致的JSON字符串,用于打印、存储等处理。
示例代码(使用JSON-B):
import jakarta.json.bind.Jsonb; import jakarta.json.bind.JsonbBuilder; @Query("getFilm") @Description("Get a film by it's id") public Film getFilm(@Name("filmId") int id) { Film film = service.getFilm(id); // 将film对象(含关联heroes)序列化为JSON字符串 try (Jsonb jsonb = JsonbBuilder.create()) { String jsonResult = jsonb.toJson(film); // 处理JSON字符串:打印、存储等 System.out.println("查询结果JSON:" + jsonResult); } return film; }
三、持久化存储并读取结果的方案
如果需要长期保存查询结果,可选择以下两种常见方式:
1. 存储到数据库
定义用于保存查询结果的JPA实体:
import jakarta.persistence.Entity; import jakarta.persistence.Id; import java.time.LocalDateTime; @Entity public class StoredGraphQLResult { @Id private String queryKey; // 用查询标识作为主键,比如"getFilmHeroes_1" private String jsonData; // 存储JSON字符串 private LocalDateTime storeTime; // 存储时间 public StoredGraphQLResult() {} public StoredGraphQLResult(String queryKey, String jsonData) { this.queryKey = queryKey; this.jsonData = jsonData; this.storeTime = LocalDateTime.now(); } // 省略getter和setter方法 }
在GraphQL方法中保存结果:
import jakarta.persistence.EntityManager; import jakarta.inject.Inject; @GraphQLApi public class FilmResources { @Inject GalaxyService service; @Inject EntityManager em; @Query("getFilm") @Description("Get a film by it's id") public Film getFilm(@Name("filmId") int id) { Film film = service.getFilm(id); String queryKey = "getFilmHeroes_" + id; try (Jsonb jsonb = JsonbBuilder.create()) { String jsonResult = jsonb.toJson(film); // 保存到数据库 em.persist(new StoredGraphQLResult(queryKey, jsonResult)); } return film; } }
读取存储的结果:
// 注入EntityManager后执行查询 StoredGraphQLResult storedResult = em.find(StoredGraphQLResult.class, "getFilmHeroes_1"); if (storedResult != null) { String jsonData = storedResult.getJsonData(); // 将JSON转回Film对象 try (Jsonb jsonb = JsonbBuilder.create()) { Film film = jsonb.fromJson(jsonData, Film.class); // 使用film对象 } }
2. 存储到本地文件
直接将JSON字符串写入文件:
import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; @Query("getFilm") @Description("Get a film by it's id") public Film getFilm(@Name("filmId") int id) { Film film = service.getFilm(id); try (Jsonb jsonb = JsonbBuilder.create()) { String jsonResult = jsonb.toJson(film); // 写入本地文件 Files.writeString(Paths.get("film-result-" + id + ".json"), jsonResult, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); } catch (Exception e) { e.printStackTrace(); } return film; }
读取文件中的结果:
import java.nio.file.Files; import java.nio.file.Paths; String jsonData = Files.readString(Paths.get("film-result-1.json")); try (Jsonb jsonb = JsonbBuilder.create()) { Film film = jsonb.fromJson(jsonData, Film.class); // 使用film对象 } catch (Exception e) { e.printStackTrace(); }
内容的提问来源于stack exchange,提问作者Abdullah Chaudhry
相关产品推荐
相关产品推荐

