起因
写了一个简单的接口。

在发起调用的时候,发现bName没有进行赋值,且返回结果属性为bname。

问题解析
先看lombok生成的get、set方法为getBName和setBName

项目中使用的序列化工具为jackson,jackson通过javaBean的get和set方法获取属性名字并进行序列化,一般情况下先去除set,再将第一个字母转为小写,并与后面的字母进行拼接,如setName,将N转为小写n,再与后面ame进行拼接,得到属性名为name。当第二个字母也为大写时,会继续把第二个字母也转为小写,再判断后续字母,如setBName经反序列化后属性名为bname。若后续字母也为大写,以此类推,如setOBJECT反序列化后的属性名为object。
protected String legacyManglePropertyName(final String basename, final int offset)
{
final int end = basename.length();
if (end == offset) { // empty name, nope
return null;
}
char c = basename.charAt(offset);
// 12-Oct-2020, tatu: Additional configurability; allow checking that
// base name is acceptable (currently just by checking first character)
if (_baseNameValidator != null) {
if (!_baseNameValidator.accept(c, basename, offset)) {
return null;
}
}
// next check: is the first character upper case? If not, return as is
char d = Character.toLowerCase(c);
if (c == d) {
return basename.substring(offset);
}
// otherwise, lower case initial chars. Common case first, just one char
StringBuilder sb = new StringBuilder(end - offset);
sb.append(d);
int i = offset+1;
for (; i < end; ++i) {
c = basename.charAt(i);
d = Character.toLowerCase(c);
if (c == d) {
sb.append(basename, i, end);
break;
}
sb.append(d);
}
return sb.toString();
}
解决方案
1、在属性上加@JsonProperty注解,在反序列化的时候给该属性重命名,如在bName属性上加上@JsonProperty(“bName”)注解,表示在反序列化的时候将属性重命名为bName。
2、对于第二个字母为大写的属性,如bName,手动将set和get方法命名为setbName和getbName。
3、使用fastJson,fastJson通过属性名而非get,set方法获取属性名并进行序列化和反序列化。
1764

被折叠的 条评论
为什么被折叠?



