资讯专栏INFORMATION COLUMN

记一次lombok的问题

DrizzleX / 2966人阅读

摘要:一案发现场此问题的案发现场是测试环境,为了减少不必要的类,我们这里用一个简单的例子进行模拟。直接看反编译代码我们再看看或者生成,是怎么样的到了这里,我们发现问题了,的,方法生成的不对。否则就返回首字母大写后的值。

一、案发现场

此问题的案发现场是测试环境,为了减少不必要的类,我们这里用一个简单的例子进行模拟。

lombok version:1.16.14

jdk version:1.8

上代码:

├─src
│  ├─main
│  │  ├─java
│  │  │  └─org
│  │  │      └─jsbxyyx
│  │  │          └─util
│  │  │                  DozerUtil.java
│  │  │
│  │  └─resources
│  └─test
│      ├─java
│      │  └─org
│      │      └─jsbxyyx
│      │          └─test
│      │                  A.java
│      │                  A1.java
│      │                  DozerTest.java
│      │
│      └─resources
package org.jsbxyyx.util;

import com.google.common.collect.Lists;
import org.dozer.DozerBeanMapper;
import java.util.Collection;
import java.util.List;

public class DozerUtil {
    private static DozerBeanMapper dozer = new DozerBeanMapper();

    public static  T map(Object source, Class destinationClass) {
        return dozer.map(source, destinationClass);
    }
    public static  List mapList(@SuppressWarnings("rawtypes") Collection sourceList, Class destinationClass) {
        List destinationList = Lists.newArrayList();
        for (Object sourceObject : sourceList) {
            T destinationObject = dozer.map(sourceObject, destinationClass);
            destinationList.add(destinationObject);
        }
        return destinationList;
    }
    public static void map(Object source, Object destinationObject) {
        dozer.map(source, destinationObject);
    }
}
package org.jsbxyyx.test;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Setter
@Getter
@ToString
public class A {
    private String date;
    private String vNum;
}
package org.jsbxyyx.test;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Setter
@Getter
@ToString
public class A1 {
    private String date;
    private String vaNum;
}
package org.jsbxyyx.test;

import java.util.HashMap;
import java.util.Map;
import org.jsbxyyx.util.DozerUtil;
import org.junit.Assert;
import org.junit.Test;

public class DozerTest {
    
    @Test
    public void testA() throws Exception {
        Map mapA = new HashMap<>();
        mapA.put("date", "2018-04-03");
        mapA.put("vNum", "123");
        A a = DozerUtil.map(mapA, A.class);
        Assert.assertEquals("123", a.getVNum());
    }
    
    @Test
    public void testA1() throws Exception {
        Map mapA1 = new HashMap<>();
        mapA1.put("date", "2018-04-03");
        mapA1.put("vaNum", "123");
        A1 a = DozerUtil.map(mapA1, A1.class);
        Assert.assertEquals("123", a.getVaNum());
    }
}
二、案件分析

我们执行测试用testA和testA1发现

testA红了

testA1绿了

红了表示测试不通过啊。。。。。我们来看看为啥不通过。

问题的关键在于lombok生成getter,setter的时候没有按照JavaBean的规范来生成。导致testA就红了。

直接看反编译代码:

A.class

我们再看看eclipse或者idea生成getter,setter是怎么样的

到了这里,我们发现问题了,lombok的getter,setter方法生成的不对。

三、案件处理

解决办法,去掉@Getter @Setter注解,用IDE生成,获取覆盖相应的getter/setter

四、案件原理追溯

那么我们来分析一下,标准JavaBean是如何生成的。

官方文档:Java Beans specification

看到英语头大有木有。。。有木有。。。有木有。。。

好我们解释一下。

首先我们来描述一下JavaBean的规范

Bean有一个默认的无参构造器

属性修饰符为private

实现接口java.io.Serializable

所有的访问器都以get开头,所有的修改器都用set,布尔类型访问器用is开头

接下来我们来说一下javabean的getters/setters是如何生成,也就解决了问题。。

这个类Introspector.decapitalize()方法,可以获取到属性

Utility method to take a string and convert it to normal Java variable name capitalization.  This normally means converting the first character from upper case to lower case, but in the (unusual) special case when there is more than one character and both the first and second characters are upper case, we leave it alone.

Thus "FooBah" becomes "fooBah" and 
"X" becomes "x", 
but "URL" stays as "URL".

意思就是第一个字母转大写后,如果第二个字母和转换后的第一个字母一样是大写,那么就返回原值。否则就返回首字母大写后的值。

问题就到这里啦。。。。。。。

原文地址:https://blog.uyiplus.com/2018/lombok-quesion-1/

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69094.html

相关文章

  • 一次修复微信支付吊起非常慢问题

    摘要:记一次修复微信支付吊起非常慢的问题微信接支付调用有些安卓手机吊起非常慢,因为调支付写法就是这样子,实在定位不到问题所在,正在打算放弃的时候。定位会导致支付吊起不了吗原来之前把浏览器定位换成了微信定位,解决安卓下面会频繁弹授权的问题。 记一次修复微信支付吊起非常慢的问题 微信h5接支付调用 window.wx.invoke(getBrandWCPayRequest) 有些安卓手机吊起非常...

    Mertens 评论0 收藏0
  • Lombok pojo类小神器

    摘要:可以去下载包目前最新版本为。对于某个具体的类来说,出于安全或者性能或者其它方面的考虑,可能并不希望全部成员都出现在方法的返回值里。根据中的建议,方法和方法要同时实现,并且保证一致性。 前言 Lombok主页 Lombok下载 Lombok引入项目之后,便可以使用 本文记录了在项目中应用Lombok时的使用案例,希望对朋友你有一些帮助。 可以去 下载jar包 maven: ...

    stackfing 评论0 收藏0
  • 一次优惠券最优使用算法

    摘要:记一次优惠券最优使用算法先说一下业务背景。公司做的一个投资的,投资金额可以用优惠券抵扣。但是无法获取具体使用了哪张优惠券简单就是很难获得优惠券的穷举法数据太多,不可控。但是这种面额的优惠券出现几率几乎没有请教期待有大神给出更好的算法 记一次优惠券最优使用算法 先说一下业务背景。公司做的一个投资的APP,投资金额可以用优惠券抵扣。红包面额(100,50,30,10) 优惠券使用规则: ...

    Lowky 评论0 收藏0

发表评论

0条评论

DrizzleX

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<