@Data注解在Boolean类型属性上的大坑
Posted 学习使得吾快乐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@Data注解在Boolean类型属性上的大坑相关的知识,希望对你有一定的参考价值。
@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()
场景二
如果已经有了is则就是正常形式了:
boolean isGirl;
在加上@Data注解后得到的get,set方法为
get方法为isGirl() 而不是getIsGirl()
set方法为setGirl 而不是setIsGirl()
以上是关于@Data注解在Boolean类型属性上的大坑的主要内容,如果未能解决你的问题,请参考以下文章
记一次 Data Binding 在 library module 中遇到的大坑
在 Core Data 中,NSManaged 对象上的 URI 属性类型应该用于啥?
记录一些遇见的bug——关于Lombok的一个大坑,使用@RequestBody接收axios请求对象时,对象所有属性均为null
记录一些遇见的bug——关于Lombok的一个大坑,使用@RequestBody接收axios请求对象时,对象所有属性均为null