SpringBoot項目使用xml格式的出入參


  1. 新建一個SpringBoot web項目
  2. 啟用jackson的xml依賴(SpringBoot已經做好了版本適配,故不需要聲明版本號)
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
</dependency>
  1. 編寫一個Controller
package com.example.mono;

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.Data;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
public class MonoApplication {

    public static void main(String[] args) {
        SpringApplication.run(MonoApplication.class, args);
    }

}

@RestController
@RequestMapping("/my")
class MyController {

    /**
     * 1:consumes = MediaType.APPLICATION_XML_VALUE 表示接受xml格式的入參,框架會將xml格式的入參轉換為bean。
     * 2:produces = MediaType.APPLICATION_XML_VALUE 表示返回xml格式的結果,框架會將返回值bean轉換為xml。
     *
     * @param me
     * @return
     */
    @PostMapping(value = "/getMe", consumes = MediaType.APPLICATION_XML_VALUE, produces = MediaType.APPLICATION_XML_VALUE)
    public Me geMe(@RequestBody Me me) {
        return me;
    }

}

@Data
@JacksonXmlRootElement(localName = "YyghInterface")  //本類對應的xml的根節點名稱
class Me {

    @JacksonXmlProperty(localName = "yyjsls")  //聲明字段在xml中的節點名稱
    private String hospitalSettleSerialNo;

    @JacksonXmlProperty(localName = "pay")
    private String amount;

    @JacksonXmlProperty(localName = "zffs")
    private String payChannel;

}
  1. postman請求localhost:8080/my/getMe(注意post方法,body為raw-xml)
接口輸入:
<interface>
    <yyjsls>111111</yyjsls>
    <pay>11.11</pay>
    <zffs>1</zffs>
</interface>

接口返回值:
<interface>
    <yyjsls>111111</yyjsls>
    <pay>11.11</pay>
    <zffs>1</zffs>
</interface>
  1. 使用原生SpringBoot按上述步驟,完全可以秒支持xml的。由於公司項目框架基於SpringBoot做了改造,故死活以json格式處理出入參,問問技術組如何解決吧。

  2. 補充一個有嵌套層次的數據對象

package com.dto.response;

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;
import java.util.List;

@Data
@JacksonXmlRootElement(localName = "YyghInterface")
public class InventoryDetailResponseXmlDTO implements Serializable {

    private static final long serialVersionUID = -697190814864891722L;

    @ApiModelProperty(value = "判斷是否返回成功1表示成功,其余失敗")
    @JacksonXmlProperty(localName = "RtnValue")
    private Integer RtnValue;

    @ApiModelProperty(value = "表示返回信息,一般用於失敗信息跟蹤反饋")
    private String bzxx;

    @ApiModelProperty(value = "interface節點")
    @JacksonXmlProperty(localName = "interface")
    private InterFaceDTO interFaceDTO;

    @Data
    public static class InterFaceDTO implements Serializable {

        private static final long serialVersionUID = 8864874279293665726L;

        @JacksonXmlProperty(localName = "row")
        @JacksonXmlElementWrapper(useWrapping = false)
        private List<RowDTO> row;
    }

    @Data
    public static class RowDTO implements Serializable {

        private static final long serialVersionUID = 2554639268967759723L;

        @ApiModelProperty(value = "就診序號")
        private String jzxh;

        @ApiModelProperty(value = "就診時間 精確到HH:MM")
        private String jzsj;

        private String jzsj2;

        /**
         * 號源類別,默認1
         * 1.普通號源,默認 4.家庭醫生專用號源 5.OA專用號源 6.醫養護平台專用號源(06共享號源--杭州健康通) 7.醫養護平台專用號
         */
        private String yylb;
    }

}

  1. 手動轉換示例
package com.dto;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.Data;

/**
 * @description:
 * @author: Yang
 * @since: 2022/11/6
 */
@Data
@JacksonXmlRootElement(localName = "output")
public class DownloadFileResultDTO {

    @JacksonXmlProperty(localName = "rowcount")
    public Integer rowCount;

    public static void main(String[] args) throws JsonProcessingException {
        // 0.實例化一個轉換器
        ObjectMapper objectMapper = new XmlMapper();

        // 1.將對象序列化為xml
        DownloadFileResultDTO xmlObject = new DownloadFileResultDTO();
        xmlObject.setRowCount(1000);
        System.out.println(objectMapper.writeValueAsString(xmlObject));

        // 2.將xml反序列化為對象
        String xmlString = "<?xml version=\"1.0\" encoding=\"GBK\" standalone=\"yes\" ?><output><rowcount>1000</rowcount></output>";
        DownloadFileResultDTO resultDTO = objectMapper.readValue(xmlString, DownloadFileResultDTO.class);
        System.err.println(resultDTO.getRowCount());
    }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM