摘要:一案發現場此問題的案發現場是測試環境,為了減少不必要的類,我們這里用一個簡單的例子進行模擬。直接看反編譯代碼我們再看看或者生成,是怎么樣的到了這里,我們發現問題了,的,方法生成的不對。否則就返回首字母大寫后的值。
一、案發現場
此問題的案發現場是測試環境,為了減少不必要的類,我們這里用一個簡單的例子進行模擬。
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 staticT 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/
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69094.html
摘要:記一次修復微信支付吊起非常慢的問題微信接支付調用有些安卓手機吊起非常慢,因為調支付寫法就是這樣子,實在定位不到問題所在,正在打算放棄的時候。定位會導致支付吊起不了嗎原來之前把瀏覽器定位換成了微信定位,解決安卓下面會頻繁彈授權的問題。 記一次修復微信支付吊起非常慢的問題 微信h5接支付調用 window.wx.invoke(getBrandWCPayRequest) 有些安卓手機吊起非常...
摘要:可以去下載包目前最新版本為。對于某個具體的類來說,出于安全或者性能或者其它方面的考慮,可能并不希望全部成員都出現在方法的返回值里。根據中的建議,方法和方法要同時實現,并且保證一致性。 前言 Lombok主頁 Lombok下載 Lombok引入項目之后,便可以使用 本文記錄了在項目中應用Lombok時的使用案例,希望對朋友你有一些幫助。 可以去 下載jar包 maven: ...
摘要:記一次優惠券最優使用算法先說一下業務背景。公司做的一個投資的,投資金額可以用優惠券抵扣。但是無法獲取具體使用了哪張優惠券簡單就是很難獲得優惠券的窮舉法數據太多,不可控。但是這種面額的優惠券出現幾率幾乎沒有請教期待有大神給出更好的算法 記一次優惠券最優使用算法 先說一下業務背景。公司做的一個投資的APP,投資金額可以用優惠券抵扣。紅包面額(100,50,30,10) 優惠券使用規則: ...
閱讀 2028·2023-04-26 01:33
閱讀 1660·2023-04-26 00:52
閱讀 1035·2021-11-18 13:14
閱讀 5394·2021-09-26 10:18
閱讀 2901·2021-09-22 15:52
閱讀 1488·2019-08-29 17:15
閱讀 3017·2019-08-29 16:11
閱讀 1039·2019-08-29 16:11