getproperty方法_js中null使用

getproperty方法_js中null使用想要实现Map转为Bean的功能,使用了org.apache.commons.beanutils.BeanUtils.populate(object,map);maven依赖<dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils&…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

想要实现 Map 转为 Bean 的功能,使用了org.apache.commons.beanutils.BeanUtils.populate(object, map);
期间遇到了一些问题,遂整理了一下。

先抛结论,是因为 lombok 的配置问题。

问题发现及测试验证

maven依赖

<dependency>
	<groupId>commons-beanutils</groupId>
	<artifactId>commons-beanutils</artifactId>
	<version>1.9.4</version>
</dependency>

测试代码如下

//bean使用了lombok自动生成 getter/setter
@lombok.Data
@lombok.experimental.Accessors (chain = true)
public class JavaBean { 
   
    private String id;
    private String name;
}

// 测试方法
@Test
public void _map2Bean() throws Exception { 
   
    Map map = new HashMap();
    map.put("id", "aa");

    JavaBean bean = new JavaBean();
    org.apache.commons.beanutils.BeanUtils.populate(bean, map);

    System.out.println(bean.getId());
}

测试结果发现,bean的id为null,没有实现预想中的,将map的id值设置到 bean 的id属性上去。

讲道理,不应该。
遂debug了一波测试用例,发现BeanUtils底层使用了PropertyDescriptor反射获取属性,通过PropertyDescriptor的getWriteMethod()方法获取属性的setter方法,最后通过setter方法给属性赋值。
在调试时发现是 getWriteMethod()方法返回了 null(也就是获取不到setter方法),导致后续没有执行赋值操作。

为什么呢?明明我们使用了 lombok 自动给 JavaBean 生成了 getter/setter,难道 lombok 还有猫腻?

通过反编译插件,查看了JavaBean编译后的class文件,咋一看没什么,但发现!!!
在这里插入图片描述
自动生成的 setter 方法签名不是返回 void,而是返回了 本身。

检查了下,发现JavaBean类使用了 lombok的Accessors 注解,该注解用于支持链式调用,即 new JavaBean().setId("xxx").setName("xxx");这种写法。

为确定是否@lombok.experimental.Accessors (chain = true)注解影响,去掉 JavaBean的注解,重新测试了一下,发现正常了

@lombok.Data
//@lombok.experimental.Accessors (chain = true)//用于支持链式调用,去掉该注解进行测试
public class JavaBean { 
   
    private String id;
    private String name;
}

// 测试方法
@Test
public void _map2Bean() throws Exception { 
   
    Map map = new HashMap();
    map.put("id", "aa");
    JavaBean bean = new JavaBean();
    org.apache.commons.beanutils.BeanUtils.populate(bean, map);
    System.out.println(bean.getId());
}

好了,原因知道了。
Accessors 注解导致JavaBean生成的 setter 方法不被 PropertyDescriptor 识别,才导致获取 setter为null。

解决办法:

1、去掉 Accessors 注解
2、摸索中…
发现了这个 Introspector.findMethod(Class<?> cls, String methodName, int argCount, Class args[]);
能按方法名获取Method对象,那么要自己实现转换逻辑,可以尝试,摸索中…


end

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/189153.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 基于HTTP重定向的GSLB工作流程「建议收藏」

    基于HTTP重定向的GSLB工作流程「建议收藏」1.用户向网站的localdns请求域名解析2.localdns向用户返回GSLB设备的ip地址,如果GSLB系统本身有负载均衡,则返回的IP地址就是自身负载均衡后的某台设备的IP地址3.用户向这台GSLB设备发起GET请求,请求该网站的网页的内容.如果网页上有图片,文字,视频则会发起多个HTTP请求4.GSLB设备将综合分析用户ip,内容分布,设备负载,链路状况等实时…

    2022年5月6日
    68
  • Ant 执行 YUICompressor

    Ant 执行 YUICompressorAnt执行YUICompressor任务压缩JavaScript和CSS文件,解决中文乱码问题,增加源文件字符编码集设定标签:javascriptantcss任务encodingnull2012-04-0510:465376人阅读评论(4)收藏举报分类:Java(14)Ant版权声明:本文为博主原创文章,未经博主允许…

    2022年7月18日
    13
  • shopee东南亚电商ERP系统[通俗易懂]

    shopee东南亚电商ERP系统[通俗易懂]【上马ERP】专注东南亚本地电商市场,对接shopeeLazadatokopediaJD.idBilbilAkulaku等电商平台一套根据东南亚本地电商需求深度订制的ERP/WMS仓储系统!上马特色功能:【自动处理pickupGo-jek,Gosend,Grad订单】【自动打印快递面单】:美观、高效、准确、效率【自动更新平台订单】:结合仓库现有库存,自动更新平台库存,100%防止超卖;【智能化仓库管理】:智能生成拣货清单,高效准确管理仓库;【实时校验订…

    2022年9月20日
    2
  • 不能逃避的分离「建议收藏」

    生命的意义是什么,我一直在探索 !对我来说,刚刚过往一个年,过年在家的状态是简单单纯的,不用去思考很多事情,就是享受家的感觉,享受和家人一切的幸福。2018这个年在家待的时间比较久,因为外出工作,现在也在外面生活,和家人在一起的时间真的很少,从2015年毕业后到外面工作一直是一年回家一次,2017还算多,回家两次,但是即便是回家两次,真正在家里待的时间也是不多的,仔细算算在父母有限…

    2022年2月27日
    54
  • java学习路线图(2018年最新版)

    java学习路线图(2018年最新版)java学习路线图(2018年最新版)最近有些网友问我如何自学Java后端,还有些是想从别的方向想转过来,但都不太了解Java后端究竟需要学什么,究竟要从哪里学起,哪些是主流的Java后端技术等等,导致想学,但又很迷茫,不知从何下手。我就以过来人的经历,写在这篇博客里,不一定都对,但都是我根据自己的经历总结出来的,供你们的参考。Java基础Java是一门纯粹的面向对象的编程语言,所…

    2022年5月13日
    49
  • isnotempty和isnotnull_isannotationpresent()用法

    isnotempty和isnotnull_isannotationpresent()用法引入包:org.apache.commons.lang3.StringUtils;1.publicstaticbooleanisEmpty(Stringstr)判断某字符串是否为空,为空的标准是str==null或str.length()==0下面是StringUtils判断是否为空的示例:StringUtils.isEmpty(null)=trueStringUtils.isEm…

    2022年9月27日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号