在Quarkus中使用SmallRye GraphQL Client解析JSON标量类型
解决Quarkus SmallRye GraphQL Client解析Contentful富文本JSON标量字段的问题
问题场景
基于Quarkus构建服务,使用SmallRye GraphQL Client查询Contentful GraphQL API时,其他字段(包括嵌套字段)均可正常解析,但Contentful富文本对应的JSON非空标量字段无法解析。该json字段无下属子字段,无法通过创建嵌套类完成映射。
解决方案
方案1:自定义JSON标量反序列化器
SmallRye GraphQL Client支持自定义标量处理逻辑,通过实现ScalarMapper接口适配Contentful的JSON标量:
- 实现自定义标量映射类
import io.smallrye.graphql.client.api.ScalarMapper; import jakarta.json.JsonValue; import jakarta.json.bind.Jsonb; import jakarta.json.bind.JsonbBuilder; public class ContentfulJsonScalarMapper implements ScalarMapper<JsonValue, Object> { private final Jsonb jsonb = JsonbBuilder.create(); @Override public Object fromGraphQLScalar(JsonValue value) { // 可按需转换为Map、自定义DTO等类型,这里以Object为例 return jsonb.fromJson(value.toString(), Object.class); } @Override public JsonValue toGraphQLScalar(Object input) { // 查询场景下无需序列化,返回null即可 return null; } }
- 在Quarkus配置中注册该映射器
修改application.properties,添加对应客户端的标量映射配置:
quarkus.smallrye-graphql-client."你的客户端名称".scalar-mappers=com.your.package.ContentfulJsonScalarMapper
替换你的客户端名称为实际配置的GraphQL客户端名,com.your.package.ContentfulJsonScalarMapper为自定义类的全路径。
方案2:用String类型直接接收
若无需即时解析JSON结构,可在DTO中将json字段定义为String类型,后续自行解析:
public class ContentfulEntry { // 其他业务字段 private String json; // 映射富文本的JSON标量字段 // getter、setter方法 }
后续解析示例:
Jsonb jsonb = JsonbBuilder.create(); Map<String, Object> richTextData = jsonb.fromJson(entry.getJson(), new TypeReference<Map<String, Object>>(){});
方案3:使用Jakarta JsonValue类型接收
直接用jakarta.json.JsonValue映射字段,保留JSON原始结构以便灵活操作:
public class ContentfulEntry { // 其他业务字段 private JsonValue json; // getter、setter方法 }
使用示例:
JsonObject richTextObject = (JsonObject) entry.getJson(); JsonArray contentNodes = richTextObject.getJsonArray("content"); // 按需处理JSON节点
内容的提问来源于stack exchange,提问作者Mohamed Houssein Douici
相关产品推荐
相关产品推荐

