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


相关推荐

  • pytest报错_git撤销本地提交

    pytest报错_git撤销本地提交前言我们每天写完自动化用例后都会提交到git仓库,随着用例的增多,为了保证仓库代码的干净,当有用例新增的时候,我们希望只运行新增的未提交git仓库的用例。pytest-picked插件可以

    2022年7月31日
    6
  • 《深入浅出MFC》读书笔记

    《深入浅出MFC》读书笔记http://www.zooyoo.org/%E3%80%8A%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BAmfc%E3%80%8B%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0%EF%BC%88%E5%8D%81%E4%B8%

    2022年6月18日
    21
  • 【转】Matlab axis用法

    【转】Matlab axis用法Matlabaxis用法转自:http://blog.sina.com.cn/s/blog_b26a90750101kxdx.htmlaxisoff;%去掉坐标轴axistight;%紧坐标轴axisequal;%等比坐标轴axis([-0.1,8.1,-1.1,1.1]);%坐标轴的显示范围%gca:gca,h=figur…

    2022年5月29日
    36
  • unbuntu版 pycharm2021.9 激活码【2021免费激活】[通俗易懂]

    (unbuntu版 pycharm2021.9 激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~83PVI25FMO-eyJsaWNlb…

    2022年3月27日
    149
  • python详细安装教程环境配置_Python配置环境

    python详细安装教程环境配置_Python配置环境一、准备相应的材料本教程需要的文件如下表所示:文件名简介作用Anaconda3-2021.05-Windows-x86_64.exeAnaconda的安装包配置管理python环境Miniconda3-py39_4.9.2-Windows-x86_64.exe精简版的Anaconda的安装包(电脑配置较差时使用)配置管理python环境pycharm-community-2021.1.3.exePyCharm安装包Python代码的编辑器以上文件可在链

    2022年8月29日
    2
  • hacker.4

    hacker.4

    2021年8月11日
    231

发表回复

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

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