- 新建一個SpringBoot web項目
- 啟用jackson的xml依賴(SpringBoot已經做好了版本適配,故不需要聲明版本號)
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
- 編寫一個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;
}
- 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>
-
使用原生SpringBoot按上述步驟,完全可以秒支持xml的。由於公司項目框架基於SpringBoot做了改造,故死活以json格式處理出入參,問問技術組如何解決吧。
-
補充一個有嵌套層次的數據對象
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;
}
}
- 手動轉換示例
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());
}
}