摘要:一案發(fā)現(xiàn)場(chǎng)此問(wèn)題的案發(fā)現(xiàn)場(chǎng)是測(cè)試環(huán)境,為了減少不必要的類,我們這里用一個(gè)簡(jiǎn)單的例子進(jìn)行模擬。直接看反編譯代碼我們?cè)倏纯椿蛘呱桑窃趺礃拥牡搅诉@里,我們發(fā)現(xiàn)問(wèn)題了,的,方法生成的不對(duì)。否則就返回首字母大寫后的值。
一、案發(fā)現(xiàn)場(chǎng)
此問(wèn)題的案發(fā)現(xiàn)場(chǎng)是測(cè)試環(huán)境,為了減少不必要的類,我們這里用一個(gè)簡(jiǎn)單的例子進(jìn)行模擬。
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()); } }
我們執(zhí)行測(cè)試用testA和testA1發(fā)現(xiàn)
testA紅了
testA1綠了
紅了表示測(cè)試不通過(guò)啊。。。。。我們來(lái)看看為啥不通過(guò)。
問(wèn)題的關(guān)鍵在于lombok生成getter,setter的時(shí)候沒(méi)有按照J(rèn)avaBean的規(guī)范來(lái)生成。導(dǎo)致testA就紅了。
直接看反編譯代碼:
A.class
我們?cè)倏纯磂clipse或者idea生成getter,setter是怎么樣的
到了這里,我們發(fā)現(xiàn)問(wèn)題了,lombok的getter,setter方法生成的不對(duì)。
三、案件處理解決辦法,去掉@Getter @Setter注解,用IDE生成,獲取覆蓋相應(yīng)的getter/setter
四、案件原理追溯那么我們來(lái)分析一下,標(biāo)準(zhǔn)JavaBean是如何生成的。
官方文檔:Java Beans specification
看到英語(yǔ)頭大有木有。。。有木有。。。有木有。。。
好我們解釋一下。
首先我們來(lái)描述一下JavaBean的規(guī)范
Bean有一個(gè)默認(rèn)的無(wú)參構(gòu)造器
屬性修飾符為private
實(shí)現(xiàn)接口java.io.Serializable
所有的訪問(wèn)器都以get開(kāi)頭,所有的修改器都用set,布爾類型訪問(wèn)器用is開(kāi)頭
接下來(lái)我們來(lái)說(shuō)一下javabean的getters/setters是如何生成,也就解決了問(wèn)題。。
這個(gè)類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".
意思就是第一個(gè)字母轉(zhuǎn)大寫后,如果第二個(gè)字母和轉(zhuǎn)換后的第一個(gè)字母一樣是大寫,那么就返回原值。否則就返回首字母大寫后的值。
問(wèn)題就到這里啦。。。。。。。
原文地址:https://blog.uyiplus.com/2018/lombok-quesion-1/
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/69094.html
摘要:記一次修復(fù)微信支付吊起非常慢的問(wèn)題微信接支付調(diào)用有些安卓手機(jī)吊起非常慢,因?yàn)檎{(diào)支付寫法就是這樣子,實(shí)在定位不到問(wèn)題所在,正在打算放棄的時(shí)候。定位會(huì)導(dǎo)致支付吊起不了嗎原來(lái)之前把瀏覽器定位換成了微信定位,解決安卓下面會(huì)頻繁彈授權(quán)的問(wèn)題。 記一次修復(fù)微信支付吊起非常慢的問(wèn)題 微信h5接支付調(diào)用 window.wx.invoke(getBrandWCPayRequest) 有些安卓手機(jī)吊起非常...
摘要:可以去下載包目前最新版本為。對(duì)于某個(gè)具體的類來(lái)說(shuō),出于安全或者性能或者其它方面的考慮,可能并不希望全部成員都出現(xiàn)在方法的返回值里。根據(jù)中的建議,方法和方法要同時(shí)實(shí)現(xiàn),并且保證一致性。 前言 Lombok主頁(yè) Lombok下載 Lombok引入項(xiàng)目之后,便可以使用 本文記錄了在項(xiàng)目中應(yīng)用Lombok時(shí)的使用案例,希望對(duì)朋友你有一些幫助。 可以去 下載jar包 maven: ...
摘要:記一次優(yōu)惠券最優(yōu)使用算法先說(shuō)一下業(yè)務(wù)背景。公司做的一個(gè)投資的,投資金額可以用優(yōu)惠券抵扣。但是無(wú)法獲取具體使用了哪張優(yōu)惠券簡(jiǎn)單就是很難獲得優(yōu)惠券的窮舉法數(shù)據(jù)太多,不可控。但是這種面額的優(yōu)惠券出現(xiàn)幾率幾乎沒(méi)有請(qǐng)教期待有大神給出更好的算法 記一次優(yōu)惠券最優(yōu)使用算法 先說(shuō)一下業(yè)務(wù)背景。公司做的一個(gè)投資的APP,投資金額可以用優(yōu)惠券抵扣。紅包面額(100,50,30,10) 優(yōu)惠券使用規(guī)則: ...
閱讀 2038·2023-04-26 01:33
閱讀 1666·2023-04-26 00:52
閱讀 1047·2021-11-18 13:14
閱讀 5454·2021-09-26 10:18
閱讀 2915·2021-09-22 15:52
閱讀 1495·2019-08-29 17:15
閱讀 3025·2019-08-29 16:11
閱讀 1044·2019-08-29 16:11