1. 程式人生 > >springboot~Money型別在序列化時遇到的問題與解決

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);
  }
}

下面說幾個全域性性的註解:

bean(即Java bean)就是Java的類,或者說,就是Java語言的元件,充分體現了Java語言平臺獨立和麵向物件程式設計的優勢。JavaBeans是一代網路程式設計師的資源。它是Java語言的元件:bean的介面和通訊部分的標準,實現了bean的複用。

@Configuration標註在類上,相當於把該類作為spring的xml配置檔案中的<beans>,作用為:配置spring容器(應用上下文)

@Bean標註在方法上(返回某個例項的方法),等價於spring的xml配置檔案中的<bean>,作用為:註冊bean物件

下面使用@Bean註解需要注意的幾點說明:

  1. @Bean註解在返回例項的方法上,如果未通過@Bean指定bean的名稱,則預設與標註的方法名相同; 
  2. @Bean註解預設作用域為單例singleton作用域,可通過@Scope(“prototype”)設定為原型作用域; 
  3. 既然@Bean的作用是註冊bean物件,那麼完全可以使用@Component、@Controller、@Service、@Ripository等註解註冊bean,當然需要配置@ComponentScan註解進行自動掃描。

感謝各位的閱讀!