@Data注解在Boolean类型属性上的大坑及解决
作者:学习使得吾快乐
在使用@Data注解时,如果类中存在Boolean类型的属性,且属性名不是以"is"开头,那么@Data注解生成的get方法名会默认加上"is",导致属性值无法成功拷贝,解决方法是手动添加get方法,覆盖@Data注解生成的方法
@Data注解在Boolean类型属性上的大坑
直接看总结吧
问题描述
将A类的值拷贝到B类,且A类中多余的属性存放到B类的extraElement属性中;
发现问题:Boolean属性的字段没有完成拷贝
具体描述信息
- 类A:
@Data public class A { private String id; private String name; private boolean sex; }
- 类B:
@Data public class B { private String id; private String extraElement; }
拷贝的代码
public static void main(String[] args) { A a = new A(); a.setId(Pub.getUUID()); a.setSex(true); a.setName("test"); B b = new B(); ToolBeans.copyPropertiesToExtra( a, b, "extraElement" ); System.out.println(a); System.out.println(b); System.out.println(b.getExtraElement()); } public static <F, T> void copyPropertiesToExtra( F from, T to, String extra ) { MethodAccess fromMethodAccess = get( from.getClass() ); MethodAccess toMethodAccess = get( to.getClass() ); Field[] fromDeclaredFields = from.getClass().getDeclaredFields(); // 获取来源的字段 JSONObject extraJson = new JSONObject(); for ( Field field : fromDeclaredFields ) { String name = field.getName(); Object value = null; try { value = fromMethodAccess.invoke( from, "get" + StringUtils.capitalize( name ), null ); toMethodAccess.invoke( to, "set" + StringUtils.capitalize( name ), value ); } catch ( Exception e ) { // 设置异常,可能会没有对应字段,忽略 extraJson.put( name, value ); } } try { toMethodAccess.invoke( to, "set" + StringUtils.capitalize( extra ), extraJson.toJSONString() ); } catch ( Exception e ) { log.error( "将数据放置到扩展字段失败", e ); } }
结果
可以明显看到id属性已经拷贝成功,多余的属性name和sex name已经进入了extraElement中,唯独sex没有拷贝成功
发现原因
通过追源码后发现
对于Boolean类型的数据, @Data给到的get方法名默认为isSex而不是getSex
问题解决
手动添加get方法,覆盖掉@Data注解的方法
再次运行:
问题解决!
问题总结
添加@Data注解时, 如果有boolean属性的数据,且属性的名字还不是is开头的,则默认的get方法就会把is给加上
场景1
boolean sex;
在加上@Data注解后得到的get set方法为
set方法正常但get方法是 isSex() 而不是 getSex()
场景2
如果已经有了is则就是正常形式了:
boolean isGirl;
在加上@Data注解后得到的get,set方法为
- get方法为isGirl() 而不是getIsGirl()
- set方法为setGirl 而不是setIsGirl()
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。