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

GAE应用(Java8+Cloud Endpoints v2)Long被序列化为String,如何修改?

解决Cloud Endpoints Framework v2中Long类型序列化为数字而非字符串的问题

在Cloud Endpoints Framework v2(Java 8 GAE)环境下,Long类型默认被序列化为字符串通常是框架为了避免JavaScript处理大整数时的精度丢失,但如果你的业务场景不需要这个保护,有以下几种方法修改序列化行为:

方法一:全局配置Jackson(推荐统一修改)

Endpoints v2底层依赖Jackson处理序列化/反序列化,你可以通过自定义Jackson配置类来全局调整Long的序列化规则:

  1. 创建自定义Jackson配置类:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.google.api.server.spi.config.JacksonConfig;

public class CustomLongSerializationConfig extends JacksonConfig {
    @Override
    public ObjectMapper getObjectMapper() {
        ObjectMapper mapper = super.getObjectMapper();
        // 关闭"将数字序列化为字符串"的特性,让Long直接输出为数字
        mapper.disable(SerializationFeature.WRITE_NUMBERS_AS_STRINGS);
        return mapper;
    }
}
  1. 在你的@Api注解中指定这个配置类:
@Api(
    name = "yourApiName",
    version = "v1",
    jacksonConfig = CustomLongSerializationConfig.class
)
public class YourApiClass {
    // 你的API方法...
}

方法二:针对特定字段单独修改

如果你只想调整UserOperationsResponse中的Long列表字段,不需要全局修改,可以使用Jackson的@JsonSerialize注解指定序列化器:

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.NumberSerializer;
import java.util.List;

public class UserOperationsResponse {
    // 对Long类型的列表元素指定数字序列化器
    @JsonSerialize(contentUsing = NumberSerializer.class)
    private List<Long> operationIds; // 替换为你的实际字段名

    // getter和setter方法...
}

如果是单个Long字段,直接用@JsonSerialize(using = NumberSerializer.class)即可,无需contentUsing。

注意事项

  • 如果你处理的Long值可能超过JavaScript的安全整数范围(即大于2^53-1),建议保留字符串序列化,避免前端处理时出现精度丢失问题。
  • GAE Java 8环境下Endpoints Framework v2默认已包含Jackson相关依赖,无需额外引入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:12:02