javaBean第二个字母大写与jackson的坑

起因

写了一个简单的接口。
在这里插入图片描述 在这里插入图片描述
在发起调用的时候,发现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方法获取属性名并进行序列化和反序列化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值