使用@JsonProperty映射下划线字段为驼峰后,请求哈希验证失败该如何解决?
问题根源
你遇到的哈希不一致问题,核心原因是混用了Jackson和Gson两个JSON处理库:
- 你用Jackson的
@JsonProperty注解将下划线字段映射为驼峰Java字段,但Gson并不识别Jackson的注解; - 用
gson.toJson(req)序列化时,Gson会直接使用Java字段名(currencyReceived)生成JSON,而原始请求的字段是currency_received,两者JSON结构完全不同,最终哈希值自然无法匹配。
解决方案
方案1:统一使用Jackson完成序列化(推荐)
既然你已经用Jackson做反序列化,直接用Jackson的ObjectMapper来序列化请求对象,它会自动遵循@JsonProperty的配置,生成和原始请求结构一致的JSON:
// 初始化ObjectMapper(建议全局单例) ObjectMapper objectMapper = new ObjectMapper(); // 关闭缩进,保证和原始请求的JSON格式一致(避免空格/换行影响哈希) objectMapper.configure(SerializationFeature.INDENT_OUTPUT, false); String reqObj = objectMapper.writeValueAsString(req); String hashVal = HashGeneratorUtils.generateHmacSHA512(reqObj, pvt_key);
这个方案最简洁,避免跨库注解不兼容的问题,也能保证序列化逻辑和原始请求的生成逻辑一致。
方案2:让Gson识别Jackson的@JsonProperty注解
如果必须使用Gson,可以通过注册适配器让Gson支持Jackson的注解,需要添加对应依赖并配置Gson:
// 依赖需包含 com.google.gson:gson 和 com.fasterxml.jackson.core:jackson-annotations Gson gson = new GsonBuilder() .registerTypeAdapterFactory(new JacksonAnnotationAdapter()) .create(); String reqObj = gson.toJson(req); String hashVal = HashGeneratorUtils.generateHmacSHA512(reqObj, pvt_key);
方案3:添加Gson的@SerializedName注解兼容
在Java字段上同时添加Gson的@SerializedName注解,和@JsonProperty保持一致,这样Gson序列化时会使用下划线字段名:
@JsonProperty("currency_received") @SerializedName("currency_received") private CurrencyReceived currencyReceived;
之后用Gson序列化就能生成和原始请求一致的JSON字段名。
额外注意事项
- 序列化时要保证和原始请求的JSON格式完全一致:比如是否忽略空值、字段顺序、是否有缩进/空格,这些细节都会影响哈希结果;
- 如果原始请求的JSON有固定字段顺序,需要配置JSON库保持相同顺序(比如Jackson可以开启
MapperFeature.SORT_PROPERTIES_ALPHABETICALLY,或者自定义排序)。
内容的提问来源于stack exchange,提问作者arqam
相关产品推荐
相关产品推荐

