springboot~Money型別在序列化時遇到的問題與解決
阿新 • • 發佈:2018-12-29
在java擴充套件包裡,有這樣一個包,它可以描述貨幣型別,它說幣種和金額組成,可以應用在任何複雜的場合裡,這個物件結構如下:
{ "price": { "amount": 1799.99, "currency": "USD" } }
如果希望引用Money型別包,可以使用下面的包路徑
org.javamoney:moneta:1.1
對包進行更新,然後在程式碼中可以使用Money型別
@Builder @Getter @ToString @NoArgsConstructor @AllArgsConstructorpublic class UserInfo { private String name; private String email; @ValidateMoney(value = 1, message = "年紀最小為1歲.") private Money price; }
在進行單元測試時,我們把這個物件作為請求體,在webapi裡進行接收,這時出現了一個money序列化的問題,如下異常
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `org.javamoney.moneta.Money`
主要原因是,你的money物件沒有找到序列化的組成,我們需要安裝一個第三方的組成,來幫我們實現序列化的工作,build.gradle裡新增包引用
compile('org.zalando:jackson-datatype-money:1.0.0-RC2')
然後新增Jackson的配置檔案,你可以在程式碼根目錄去新增它
依賴包程式碼:
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); } }
下面說幾個全域性性的註解:
bean(即Java bean)就是Java的類,或者說,就是Java語言的元件,充分體現了Java語言平臺獨立和麵向物件程式設計的優勢。JavaBeans是一代網路程式設計師的資源。它是Java語言的元件:bean的介面和通訊部分的標準,實現了bean的複用。@Configuration標註在類上,相當於把該類作為spring的xml配置檔案中的<beans>
,作用為:配置spring容器(應用上下文)
@Bean標註在方法上(返回某個例項的方法),等價於spring的xml配置檔案中的<bean>
,作用為:註冊bean物件
下面使用@Bean註解需要注意的幾點說明:
- @Bean註解在返回例項的方法上,如果未通過@Bean指定bean的名稱,則預設與標註的方法名相同;
- @Bean註解預設作用域為單例singleton作用域,可通過@Scope(“prototype”)設定為原型作用域;
- 既然@Bean的作用是註冊bean物件,那麼完全可以使用@Component、@Controller、@Service、@Ripository等註解註冊bean,當然需要配置@ComponentScan註解進行自動掃描。
感謝各位的閱讀!