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


相关推荐

  • MySQL5.7版本sql_mode=only_full_group_by问题解决办法

    MySQL5.7版本sql_mode=only_full_group_by问题解决办法在服务器数据库查询使用了GROUPBY居然报出了1055-Expression#1ofSELECTlistisnotinGROUPBYclauseandcontainsnonaggregatedcolumn’csc_risk.a.DefaultDate’whichisnotfunctionallydependentoncolumnsin…

    2022年5月9日
    60
  • JQuery安装与下载教程

    JQuery安装与下载教程jQuery安装与下载JQuery是一个javaScript库,是一个轻量级的”写的少,做的多”的JavaScript库。jQuery极大地简化javaScript编程–juery相比js优点:jquery的onload加载事件速度更快,并且多个加载并行 【jq绑定事件都是使用的事件函数,不需要加on】; js的onloa…

    2022年6月6日
    68
  • centos利用yum安装卸载软件常用命令

    centos利用yum安装卸载软件常用命令

    2021年10月8日
    40
  • 数列极限定义的具体解释(举例)–十分易懂

    数列极限定义的具体解释(举例)–十分易懂数列极限定义的具体解释(举例)–十分易懂自己看书没彻底明白,百度了几个还不错的解释。直接上图吧!这里重点看举例这个解释很好理解了。2.下面的另一种解释指出了N是项数并配图例。如果朋友们还有更好的理解方法,欢迎留言哦!谢谢…

    2022年5月2日
    38
  • 13个大数据应用案例,告诉你最真实的大数据故事[通俗易懂]

    13个大数据应用案例,告诉你最真实的大数据故事[通俗易懂]   大数据真的太神奇了,真的可以让改变一个企业的运营吗?答案是肯定的。大数据目前是当下最火热的词了,你要是不知道大数据这个概念,都不好意思在众人面前开口了。然而实际上很多人都对大数据的应用模糊不清。现在就让我们从下面十三个大数据应用案例来了解下最真实的大数据故事把,并鲜明得了解大数据在生活当中实际应用的情况。大数据应用案例之电视媒体  对于体育爱好者,追踪电视播放的最新运动赛事几乎是一件不…

    2022年6月4日
    77
  • XPS文件转换为PDF不再愁!全新XPS/EPS文档处理神器Aspose.Page来啦!

    XPS文件转换为PDF不再愁!全新XPS/EPS文档处理神器Aspose.Page来啦!近月,针对Aspose.XPS和Aspose.EPS做了一些改动,将其合并成Aspose.Page,同样可以使用现有许可证访问这两种产品的所有功能。Aspose.Page(点击下载)是集成On-PremiseAPI,以.NET和Java应用程序中创建,操作或转换XPS,EPS和PS文件。或使用免费应用程序即时查看或转换文件。功能亮点Aspose.Page允许文档转换。例如,您可以将XPS…

    2022年5月4日
    72

发表回复

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

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