目标
记录 FastJson 异常 com.alibaba.fastjson.JSONException: set property error,
及处理方法 。
异常还原
对象代码:
@Data
public class User implements Serializeable{
private String firstName;
private String lastName;
public String getUserName(){
if(StringUtils.isBlank(this.firstName) || StringUtils.isBlank(this.lastName)){
return "";
}
return this.firstName + " " + this.lastName;
}
}
业务代码:
public static void main(String[] args) {
User user = new User();
user.setFirstName("XZ");
user.setLastName("BD");
User userFromJson = JSON.toJavaObject((JSON) JSON.toJSON(user), User.class);
System.out.println(userFromJson.getUserName());
}
原因
根据异常信息:
com.alibaba.fastjson.JSONException: set property error,com.xzbd.jdemo.entry.User#userName
可知是对 User 中 userName 字段设置属性(set property error
)时报错的了。而 User 对象并没有提供 userName 属性和 setUserName 方法,为什么会有这个错误提示呢?
原因自然是源代码提供了与 userName
相关的一个方法 getUserName
有关。目前怀疑 FastJSON 解析了 getXXX 方法,认为 User 对象提供了 userName
属性。这种解析方案在 java 中非常常见,但显然存在问题。真实情况需要进一步验证。
修复方案
修改代码 getUserName()
为 userName()