@Data注解在Boolean类型属性上的大坑及解决

 更新时间:2024年10月29日 08:50:40   作者:学习使得吾快乐  
在使用@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()

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解Java事件编程的使用

    详解Java事件编程的使用

    Java事件在很多地方都可以使用,合理的使用事件编程,相比常规逻辑的编程,这可达到主次分明,让程序吞吐量即处理能力更强,改动更少,下面我们举一个例子说明如何使用Java使用,需要的朋友可以参考下
    2021-06-06
  • Java实现动态验证码生成

    Java实现动态验证码生成

    这篇文章主要为大家详细介绍了Java实现动态验证码生成,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • MyBatis注解实现动态SQL问题

    MyBatis注解实现动态SQL问题

    这篇文章主要介绍了MyBatis注解实现动态SQL问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Spring Security十分钟入门教程

    Spring Security十分钟入门教程

    这篇文章主要介绍了Spring Security入门教程,Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架
    2022-09-09
  • 用Java实现简单画板功能

    用Java实现简单画板功能

    这篇文章主要为大家详细介绍了用Java实现简单画板功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • Spring MVC如何设置请求头和响应头的Header

    Spring MVC如何设置请求头和响应头的Header

    这篇文章主要介绍了Spring MVC如何设置请求头和响应头的Header问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • SpringBoot如何使用applicationContext.xml配置文件

    SpringBoot如何使用applicationContext.xml配置文件

    这篇文章主要介绍了SpringBoot使用applicationContext.xml配置文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Spring Boot Controller处理HTTP请求体的方法

    Spring Boot Controller处理HTTP请求体的方法

    Spring Boot提供了强大的机制来处理不同 Content-Type​ 的HTTP请求体,这主要依赖于 HttpMessageConverter​ 接口的各种实现,它们能够自动将请求体内容转换成Java方法参数,本文给大家介绍Spring Boot Controller处理HTTP请求体的方法,感兴趣的朋友一起看看吧
    2025-05-05
  • 详解java开启异步线程的几种方法(@Async,AsyncManager,线程池)

    详解java开启异步线程的几种方法(@Async,AsyncManager,线程池)

    在springboot框架中,可以使用注解简单实现线程的操作,还有AsyncManager的方式,如果需要复杂的线程操作,可以使用线程池实现,本文通过实例代码介绍java开启异步线程的几种方法(@Async,AsyncManager,线程池),感兴趣的朋友一起看看吧
    2023-09-09
  • Java Volatile关键字实现原理过程解析

    Java Volatile关键字实现原理过程解析

    这篇文章主要介绍了Java Volatile关键字实现原理过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03

最新评论