springboot~Money類型在序列化時遇到的問題與解決
在java擴展包里,有這樣一個包,它可以描述貨幣類型,它說幣種和金額組成,可以應用在任何復雜的場合里,這個對象結構如下:
{ "price": { "amount": 1799.99, "currency": "USD" } }
如果希望引用Money類型包,可以使用下面的包路徑
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; }
在進行單元測試時,我們把這個對象作為請求體,在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); } }
下面說幾個全局性的注解:
@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注解進行自動掃描。
本文@Configuration和@Bean注解的參考來自:https://blog.csdn.net/javaloveiphone/article/details/52182899
感謝各位的閱讀!
浙公網安備 33010602011771號