【问题标题】:How do I convert kotlin data class to xml using fasterxml?如何使用 fastxml 将 kotlin 数据类转换为 xml?
【发布时间】:2020-07-08 05:53:28
【问题描述】:

我有一个想要序列化为 xml 的 kotlin 数据类。我正在使用杰克逊 Fasterxml。但是,当我序列化该类时,JacksonXmlProperty 被忽略,因此没有提供所需的输出。这是我正在处理的数据类。

@JacksonXmlRootElement(localName = "COMMAND")
data class Request(
        @JacksonXmlProperty(localName = "TYPE")
        val type: String,

        @JacksonXmlProperty(localName = "INTERFACEID")
        val interfaceId: String,

        @JacksonXmlProperty(localName = "MSISDN")
        val msisdn: String,

        @JacksonXmlProperty(localName = "MSISDN2")
        val msisdn2: String,

        @JacksonXmlProperty(localName = "AMOUNT")
        val amount: Int,

        @JacksonXmlProperty(localName = "MEMO")
        val memo: String,

        @JacksonXmlProperty(localName = "EXTTRID")
        val externalTxnId: String,

        @JacksonXmlProperty(localName = "MERCHANT_TXN_ID")
        val merchantTxnId: String,

        @JacksonXmlProperty(localName = "IS_TRANS_UNIQUE_CHECK_REQUIRED")
        val isUnique: String = "Y",

        @JacksonXmlProperty(localName = "REFERENCE")
        val reference: String,

        @JacksonXmlProperty(localName = "serviceType")
        val serviceType: String,

        @JacksonXmlProperty(localName = "USERNAME")
        val username: String,

        @JacksonXmlProperty(localName = "PASSWORD")
        val password: String
)

我得到的响应忽略了 JacksonXmlProperty:

<COMMAND>
  <serviceType>MERCHPAY</serviceType>
  <type>MERCHPAY</type>
  <interfaceId>DATABUNDLES</interfaceId>
  <msisdn>733204938</msisdn>
  <msisdn2>100001929</msisdn2>
  <amount>1000</amount>
  <memo>Enter the PIN for payment of 1000 to purchase testing transaction</memo>
  <externalTxnId>07026984141550752666</externalTxnId>
  <merchantTxnId>07026984141550752666</merchantTxnId>
  <reference>Testing transaction</reference>
  <username>abcd</username>
  <password>abcd123</password>
</COMMAND>

【问题讨论】:

    标签: xml spring-boot kotlin fasterxml data-class


    【解决方案1】:

    使用 fasterxml 将 kotlin 数据类转换为 xml

    1. 确保添加对 pom 的依赖
            <dependency>
                <groupId>com.fasterxml.jackson.dataformat</groupId>
                <artifactId>jackson-dataformat-xml</artifactId>
                <version>2.10.1</version>
            </dependency>
    
    1. 在数据类上添加@field,这样@JacksonXmlProperty就不会被忽略
    @JacksonXmlRootElement(localName = "COMMAND")
    data class AirtelExpressRequest(
            @field:JacksonXmlProperty(localName = "TYPE")
            val type: String,
    
            @field:JacksonXmlProperty(localName = "INTERFACEID")
            val interfaceId: String,
    
            @field:JacksonXmlProperty(localName = "MSISDN")
            val msisdn: String,
    
            @field:JacksonXmlProperty(localName = "MSISDN2")
            val msisdn2: String,
    
            @field:JacksonXmlProperty(localName = "AMOUNT")
            val amount: Int,
    
            @field:JacksonXmlProperty(localName = "MEMO")
            val memo: String,
    
            @field:JacksonXmlProperty(localName = "EXTTRID")
            val externalTxnId: String,
    
            @field:JacksonXmlProperty(localName = "MERCHANT_TXN_ID")
            val merchantTxnId: String,
    
            @field:JacksonXmlProperty(localName = "IS_TRANS_UNIQUE_CHECK_REQUIRED")
            val isUnique: String = "Y",
    
            @field:JacksonXmlProperty(localName = "REFERENCE")
            val reference: String,
    
            @field:JacksonXmlProperty(localName = "serviceType")
            val serviceType: String,
    
            @field:JacksonXmlProperty(localName = "USERNAME")
            val username: String,
    
            @field:JacksonXmlProperty(localName = "PASSWORD")
            val password: String
    )
    
    1. 使用XmlMapper,您可以继续将数据类序列化为xml
     val xmlMapper = XmlMapper(
                    JacksonXmlModule().apply { setDefaultUseWrapper(false) }
            ).apply {
                    enable(SerializationFeature.INDENT_OUTPUT)
            }
    val strObject = Request(
                    type            = "MERCHPAY",
                    interfaceId     = "DATABUNDLES",
                    msisdn          = "733204938",
                    msisdn2         = "100001929",
                    amount          = 1_000,
                    externalTxnId   = "07026984141550752666",
                    merchantTxnId   = "07026984141550752666",
                    reference       = "Testing transaction",
                    memo            = "Enter the PIN for payment of 1000 to purchase testing transaction",
                    serviceType     = "MERCHPAY",
                    username        = "abcd",
                    password        = "abcd123"
            )
            val xml = xmlMapper.writeValueAsString(strObject)
    
    1. 输出
    <COMMAND>
      <TYPE>MERCHPAY</TYPE>
      <INTERFACEID>DATABUNDLES</INTERFACEID>
      <MSISDN>733204938</MSISDN>
      <MSISDN2>100001929</MSISDN2>
      <AMOUNT>1000</AMOUNT>
      <MEMO>Enter the PIN for payment of 1000 to purchase testing transaction</MEMO>
      <EXTTRID>07026984141550752666</EXTTRID>
      <MERCHANT_TXN_ID>07026984141550752666</MERCHANT_TXN_ID>
      <IS_TRANS_UNIQUE_CHECK_REQUIRED>Y</IS_TRANS_UNIQUE_CHECK_REQUIRED>
      <REFERENCE>Testing transaction</REFERENCE>
      <serviceType>MERCHPAY</serviceType>
      <USERNAME>abcd</USERNAME>
      <PASSWORD>abcd123</PASSWORD>
    </COMMAND>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多