You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 17:27:02