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

springboot~Money類型在序列化時遇到的問題與解決

nco 問題 代碼 1.2 第三方 sdn rdquo eip service

在java擴展包裏,有這樣一個包,它可以描述貨幣類型,它說幣種和金額組成,可以應用在任何復雜的場合裏,這個對象結構如下:

{
    "price": {
        "amount": 1799.99,
        "currency": "USD"
    }
}

如果希望引用Money類型包,可以使用下面的包路徑

org.javamoney:moneta:1.2.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的配置文件,你可以在代碼根目錄去添加它

@Configuration
class JacksonConfig {
  @Bean
  public MoneyModule moneyModule() {
    return new MoneyModule().withMonetaryAmount(Money::of);
  }
}

下面說幾個全局性的註解

@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註解進行自動掃描。


本文@Configuration和@Bean註解的參考來自:https://blog.csdn.net/javaloveiphone/article/details/52182899

感謝各位的閱讀!

springboot~Money類型在序列化時遇到的問題與解決