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

如何在Spring GraphQL中自动对Schema定义的ID类型进行Base64编码?

在Spring GraphQL中自动对ID类型字段进行Base64编码的方案

要实现自动处理所有Schema中ID类型字段的Base64编码/解码,无需在业务代码中重复编写逻辑,可以通过自定义GraphQL标量的方式覆盖内置ID类型的处理行为,具体步骤如下:

1. 实现自定义ID类型的Coercing逻辑

创建一个实现Coercing<Object, String>的类,负责ID的序列化(编码)和反序列化(解码):

import graphql.schema.Coercing;
import graphql.schema.CoercingSerializeException;
import graphql.schema.CoercingParseValueException;
import graphql.schema.CoercingParseLiteralException;
import java.util.Base64;

public class Base64IdCoercing implements Coercing<Object, String> {

    @Override
    public String serialize(Object input) throws CoercingSerializeException {
        if (input == null) return null;
        // 将ID转为字符串后执行Base64编码
        String idStr = input.toString();
        return Base64.getEncoder().encodeToString(idStr.getBytes());
    }

    @Override
    public Object parseValue(Object input) throws CoercingParseValueException {
        // 解码客户端传入的Base64格式ID
        if (!(input instanceof String)) {
            throw new CoercingParseValueException("ID必须是Base64编码的字符串");
        }
        try {
            byte[] decodedBytes = Base64.getDecoder().decode((String) input);
            String decodedStr = new String(decodedBytes);
            // 若ID为特定类型(如Long、UUID),可在此转换为对应类型
            return decodedStr;
        } catch (IllegalArgumentException e) {
            throw new CoercingParseValueException("无效的Base64编码ID", e);
        }
    }

    @Override
    public Object parseLiteral(Object input) throws CoercingParseLiteralException {
        // 处理查询语句中的ID字面量,逻辑同parseValue
        if (!(input instanceof String)) {
            throw new CoercingParseLiteralException("ID必须是Base64编码的字符串字面量");
        }
        try {
            byte[] decodedBytes = Base64.getDecoder().decode((String) input);
            String decodedStr = new String(decodedBytes);
            return decodedStr;
        } catch (IllegalArgumentException e) {
            throw new CoercingParseLiteralException("无效的Base64编码ID", e);
        }
    }
}

2. 注册自定义ID标量到Spring GraphQL

创建配置类,将自定义的ID标量注册到GraphQL运行时:

import graphql.schema.GraphQLScalarType;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.graphql.execution.RuntimeWiringConfigurer;

@Configuration
public class GraphqlScalarConfig {

    @Bean
    public GraphQLScalarType base64IdScalar() {
        return GraphQLScalarType.newScalar()
                .name("ID") // 覆盖内置的ID标量
                .description("Base64编码的ID类型")
                .coercing(new Base64IdCoercing())
                .build();
    }

    @Bean
    public RuntimeWiringConfigurer runtimeWiringConfigurer(GraphQLScalarType base64IdScalar) {
        return wiringBuilder -> wiringBuilder.scalar(base64IdScalar);
    }
}

效果说明

  • 所有Schema中定义为ID类型的字段,在返回客户端时会自动进行Base64编码;
  • 客户端传入的ID参数会自动解码,无需在控制器或数据层手动处理;
  • 若你的ID是特定类型(如Long、UUID),只需在parseValue和parseLiteral方法中,将解码后的字符串转换为对应类型即可。

内容的提问来源于stack exchange,提问作者xenoterracide

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 03:42:52