Quarkus集成Amadeus SDK时如何配置GSON解决JSON序列化异常
解决方案
异常根因
该报错本质是Quarkus默认使用Jackson作为JSON序列化工具,而Amadeus SDK返回的对象中嵌套了GSON专属的JsonObject类型,Jackson没有内置对应序列化逻辑,因此触发序列化失败。
你可以根据业务场景选择以下任意一种方案解决:
方案1:全局替换为GSON作为REST接口序列化框架
Quarkus未提供官方GSON扩展,但可以手动注册GSON的消息转换器实现:
- 第一步:引入GSON相关依赖
Maven配置(pom.xml):
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> </dependency> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-gson</artifactId> <version>6.2.7.Final</version> </dependency>
Gradle配置(build.gradle):
implementation 'com.google.code.gson:gson:2.10.1' implementation 'org.jboss.resteasy:resteasy-gson:6.2.7.Final'
- 第二步:注册GSON消息转换器
新建GSON配置类,加@Provider注解让Quarkus自动扫描加载:
import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.ext.Provider; import org.jboss.resteasy.plugins.providers.gson.GsonProvider; @Provider @Produces(MediaType.APPLICATION_JSON) public class CustomGsonProvider extends GsonProvider { // 可在这里自定义Gson配置,比如日期格式化、序列化规则等 }
- 第三步:在
application.properties中禁用Quarkus默认的Jackson序列化支持,避免冲突:
quarkus.jackson.enabled=false quarkus.resteasy.json.jackson.enabled=false
方案2:仅适配Amadeus返回对象的序列化(不全局替换JSON框架,更推荐)
如果不想全局替换Jackson,只需要让Jackson支持序列化GSON的JsonObject类型即可,改造成本最低:
- 第一步:自定义Gson JsonObject序列化器
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.std.StdSerializer; import com.google.gson.JsonObject; import java.io.IOException; public class GsonJsonObjectSerializer extends StdSerializer<JsonObject> { public GsonJsonObjectSerializer() { super(JsonObject.class); } @Override public void serialize(JsonObject value, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.writeRawValue(value.toString()); } }
- 第二步:注册序列化器到Jackson全局配置
新建Jackson配置类:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import com.google.gson.JsonObject; import javax.annotation.PostConstruct; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.inject.Instance; import javax.inject.Inject; @ApplicationScoped public class JacksonConfig { @Inject Instance<ObjectMapper> objectMapperInstance; @PostConstruct public void registerGsonSerializer() { ObjectMapper objectMapper = objectMapperInstance.get(); SimpleModule module = new SimpleModule(); module.addSerializer(JsonObject.class, new GsonJsonObjectSerializer()); objectMapper.registerModule(module); } }
方案3:单独给Amadeus REST Client配置GSON
如果你是自定义REST Client调用Amadeus接口,不需要改动全局序列化规则,只需要在对应REST Client上绑定GSON转换器即可:
- 给自定义的Amadeus REST Client接口加上
@RegisterProvider注解,注册GsonProvider即可:
import org.eclipse.microprofile.rest.client.annotation.RegisterProvider; import org.jboss.resteasy.plugins.providers.gson.GsonProvider; @RegisterProvider(GsonProvider.class) public interface AmadeusRestClient { // 定义你的Amadeus接口方法 }
内容的提问来源于stack exchange,提问作者Raghav
相关产品推荐
相关产品推荐

