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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • CurrentHashMap的实现原理

    CurrentHashMap的实现原理hash表介绍哈希表就是一种以键-值(key-indexed)存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值。哈希的思路很简单,如果所有的键都是整数,那么就可以使用一个简单的无序数组来实现:将键作为索引,值即为其对应的值,这样就可以快速访问任意键的值。这是对于简单的键的情况,我们将其扩展到可以处理更加复杂的类型的键。链式hash表链式哈希表从根本上说是由一组链表…

    2022年6月18日
    21
  • 【其他记录】Office2019专业增强版与Visio2016不能共存的解决办法

    【其他记录】Office2019专业增强版与Visio2016不能共存的解决办法office2019的安装技术是即点即用,visio2016的安装技术是windowsinstaller。(我下载的是这样)本来是先安装好了office2019,接着安装visio2016,显示无法安装visio2016。原因是:即点即用和windowsinstaller的程序不能并存,一次只能安装一种类型。一种简单的解决办法是:把office2019和visio2016全部卸载干净,…

    2022年7月19日
    29
  • jquery时间轴幻灯展示源代码

    查看效果:http://hovertree.com/texiao/jquery/75/源代码下载:http://hovertree.com/h/bjaf/8jlpc2wu.htm效果图如下:代码如下:

    2021年12月26日
    42
  • JDK1.8关于运行时常量池, 字符串常量池的要点[通俗易懂]

    JDK1.8关于运行时常量池, 字符串常量池的要点[通俗易懂]网上关于jdk1.8的各种实验,结论鱼龙混杂,很多都相矛盾,网上有的实验也被后人测试出了不同的结果很多都分辨不了真假,这里记录一下网络上正确的结论,欢迎指正!首先自行区分运行时常量池与Class文件常量池(静态常量池)的概念,JVM内存模型,方法区与永久代的区别,有些在我的其他博客有介绍,连接在文尾在JDK1.7之前运行时常量池逻辑包含字符串常量池存放在…

    2022年7月28日
    5
  • rj45口的485线如何连接_rj45接口485怎么接

    rj45口的485线如何连接_rj45接口485怎么接我们常见的网线是586,有A、B标准,一般记住其中一个标准就可以了,另外一个标准只是1、3(发送),2、6(接收)的线序颠倒一下而已。关于586B标准,我们老师给了我们一个口诀:“橙蓝绿棕白在前,3、5对调”。具体的线序是586B:白橙、橙、白绿、蓝、白蓝、绿、白棕、棕586A:白绿、绿、白橙、蓝、白蓝、橙、白棕、棕针脚定义:RJ-45连接器包括一个插头和一个插孔(或插座)。插孔安装在机器上,而插头和连接导线(现在最常用的就是采用无屏蔽双绞线的5类线)相连。EIA/TIA制定的布线标准规定了

    2025年12月10日
    7
  • springboot从入门到实战(办公应用从入门到精通书籍)

    对于SpringBoot,很多人咨询了我的研究学习资料来源,除官方文档外,特例完整整理一下自己的平时参考学习其他资料,以及分享实战项目源码和代码资源,供大家参考学习主要教程一、我的SpringBoot系列教程(2020.3更新)我的SpringBoot系列进阶教程(Github仓库源码地址)基于springboot2.0.6.RELEASE版本的代码演示集合:SpringBo…

    2022年4月14日
    49

发表回复

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

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