springboot~Money類(lei)型(xing)在序(xu)列化(hua)時遇到的問題與解決
在(zai)java擴展包(bao)里(li),有這樣一個(ge)包(bao),它可以(yi)描(miao)述貨幣(bi)類型,它說(shuo)幣(bi)種和金額組成,可以(yi)應(ying)用在(zai)任(ren)何復雜的場合(he)里(li),這個(ge)對象結構(gou)如下:
{ "price": { "amount": 1799.99, "currency": "USD" } }
如果希(xi)望引(yin)用Money類型包,可以使(shi)用下面的(de)包路徑(jing)
org.javamoney:moneta:1.1
對包進行更新,然后在代碼中可以使用Money類型
@Builder @Getter @ToString @NoArgsConstructor @AllArgsConstructor public class UserInfo { private String name; private String email; @ValidateMoney(value = 1, message = "年紀最小為1歲.") private Money price; }
在(zai)進(jin)行單元測試時,我們把這(zhe)個對象作為請(qing)求體(ti),在(zai)webapi里進(jin)行接收(shou),這(zhe)時出(chu)現了一個money序列化的問題(ti),如(ru)下(xia)異(yi)常(chang)
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `org.javamoney.moneta.Money`
主要原因(yin)是,你的(de)money對象沒有(you)找(zhao)到序列(lie)化(hua)的(de)組成,我們(men)需要安裝一(yi)個第(di)三(san)方(fang)的(de)組成,來(lai)幫我們(men)實現序列(lie)化(hua)的(de)工(gong)作,build.gradle里添(tian)加包引用(yong)
compile('org.zalando:jackson-datatype-money:1.0.0-RC2')
然后添加Jackson的配置文(wen)件,你可以在代碼根目錄去添加它(ta)
依賴包代碼:
dependencies { compile( 'org.springframework.boot:spring-boot-starter-web', 'org.zalando:jackson-datatype-money:1.0.0-RC2', 'org.javamoney:moneta:1.1' ) testCompile( 'org.springframework.boot:spring-boot-starter-test', 'org.springframework.boot:spring-boot-starter-webflux', 'org.projectlombok:lombok', 'org.javamoney:moneta:1.1' ) compileOnly( 'org.projectlombok:lombok', 'org.springframework.boot:spring-boot-configuration-processor' ) }
程序代碼:
@Configuration class JacksonConfig { @Bean public MoneyModule moneyModule() { return new MoneyModule().withMonetaryAmount(Money::of); } }
下(xia)面說幾個全局性的(de)注解:
@Configuration標注在類上,相當于把該類作為spring的xml配置文件中的<beans>,作(zuo)用為:配置spring容器(應用上(shang)下文)
@Bean標注在方法上(返回某個實例的方法),等價于spring的xml配置文件中的<bean>,作(zuo)用為:注冊bean對象
下(xia)面(mian)使用(yong)@Bean注(zhu)解(jie)需要注(zhu)意的(de)幾點(dian)說明:
- @Bean注解在返回實例的方法上,如果未通過@Bean指定bean的名稱,則默認與標注的方法名相同;
- @Bean注解默認作用域為單例singleton作用域,可通過@Scope(“prototype”)設置為原型作用域;
- 既然@Bean的作用(yong)是注(zhu)冊bean對象,那么完全(quan)可(ke)以使用(yong)@Component、@Controller、@Service、@Ripository等注(zhu)解(jie)注(zhu)冊bean,當(dang)然需要配(pei)置@ComponentScan注(zhu)解(jie)進行自動掃描(miao)。
本文(wen)@Configuration和@Bean注解(jie)的參考(kao)來自:
感謝各位的閱讀!