背景
昨天刚发了个版本,今天就有用户投诉,测试同学验证后发现确有问题,回退到上个版本就没问题了
具体来说,就是用户自定义了广告创意的落地页,但是我们没有用他自定义的落地页,而是采用了默认的落地页
这就奇怪了,这次新版本根本没有动过相关的代码,让人头大
经过研究发现,是因为我把 fastjson 的版本从 1.2.70 升级到了 1.2.76
fastjson
在 1.2.70 及之前的版本,fastjson 会对下划线字段进行智能匹配,啥意思呢?举个例子说明下
{"user_id": 100}
对应的 java bean 如下
public class User {
@JSONField(name = "user_id")
private Integer userId;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public static void main(String[] args) {
String json = "{\"userId\": 100}";
User user = JSON.parseObject(json, User.class);
System.out.println(user.getUserId());
}
}
由于 json 的 key user_id
和 javabean 的属性名 userId
不一样,我们会用 @JSONField(name = "user_id")
注解来指定映射关系
fastjson 1.2.70 及之前版本,即使指定了 javabean 的 userId
映射到 json 的 user_id
,但是如果 json 里有 userId
的 key,也能映射到 javabean 的 userId
,执行 main
方法将打印出 100
fastjson 升级到 1.2.71 时,不再支持这种映射,上述 main
方法将打印 null
问题原因
我们的 json 里某个字段之前是下划线分隔的,后来在某次版本里修改成了驼峰格式,就类似 user_id
改成了 userId
,这样新版本以后创建的数据是驼峰格式,而一些历史数据还是下划线格式的
当时的 fastjson 是 1.2.70,无论下划线还是驼峰格式都兼容,所以一直没有问题,这次新版本我想着 fastjson 早期版本有安全隐患,升级到最新版可能会更安全,结果测试时可能刚好测试数据是下划线格式的,没有出问题;发布到生产环境后,遇到驼峰格式的数据就出问题了
真是个坑啊