【SpringBoot 后台接收XML类型参数和返回XML类型参数】

文章详细介绍了如何在SpringBoot后台使用注解处理XML类型的请求参数和返回值。包括@XmlRootElement的使用,以及当名称需大写时,改用@JacksonXmlRootElement和@JacksonXmlProperty的解决方案。同时展示了复杂类型XML,如嵌套元素的处理方法。
摘要由CSDN通过智能技术生成

SpringBoot 后台接收XML类型参数和返回XML类型参数


记录一下接收xml参数的坑
简单类型xml

1.使用@XmlRootElement注解指定根元素名称,不指定默认使用类名和属性名(小写),可以使用name属性指定 根元素和子元素的标签名

@Data
@XmlRootElement
public class UserXml {
    private String name;
    private String age;
    private String address;
}

2.在controller 使用@RequestBody 接收请求参数

@GetMapping(value = "/userxml",produces = MediaType.APPLICATION_XML_VALUE)
    public UserXml userXml(@RequestBody UserXml userXml){
        return userXml;
    }

3.返回xml报文

在@xxxMapping中添加属性produces = MediaType.APPLICATION_XML_VALUE,即可返回xml形式的报文

@GetMapping(value = "/userxml",produces = MediaType.APPLICATION_XML_VALUE)
    public UserXml userXml(){
        UserXml userXml=new UserXml();
        userXml.setName("张三");
        userXml.setAge("18");
        userXml.setAddress("北京");
        return userXml;
    }

特别注意

测试发现,当使用 例如@XmlRootElement(name=“Root”) 时,如果name=“Root” 是大写的情况下,会无法映射到实体类,也无法返回xml报文,属性值都是null,目前原因不名

如果必须使用大写形式,

解决办法,改为使用@JacksonXmlRootElement和@JacksonXmlProperty 来映射xml参数,使用localName = “Root” 指定标签名,需要特别注意,使用这种方式时,属性名应该遵循驼峰命名,即首字母小写,如果大写,在返回xml报文时会造成标签重复的问题

@Data
@JacksonXmlRootElement
public class UserXml {
    @JacksonXmlProperty(localName = "Name")
    private String name;
    @JacksonXmlProperty(localName = "Age")
    private String age;
    @JacksonXmlProperty(localName = "Address")
    private String address;
}

复杂类型xml

例如:

实体类嵌套元素,Root根元素下有RequestHead和RequestBody元素,而这两个元素下各自包含了自己的子元素

@JacksonXmlRootElement(localName = "Root")
@Data
public class CABXXmlInfoResult implements Serializable {

    @JacksonXmlProperty(localName = "RequestHead")
    private RequestHead requestHead;

    @JacksonXmlProperty(localName = "RequestBody")
    private RequestBody requestBody;
    @Data
    public static class RequestHead {
        @JacksonXmlProperty(localName = "Sign")
        private String sign;
    }
    @Data
    public static class RequestBody {

        /**
         * 保险公司编码 CABX
         */
        @JacksonXmlProperty(localName = "InsuranceCode")
        private String insuranceCode;
        /**
         * 投保单号
         */
        @JacksonXmlProperty(localName = "ProposalNo")
        private String proposalNo;
        /**
         * 支付状态 true:成功
         * false:失败
         */
        @JacksonXmlProperty(localName = "PayState")
        private String payState;
        /**
         * 承保结果 成功/失败原因
         */
        @JacksonXmlProperty(localName = "Message")
        private String message;
        /**
         * 保单号
         */
        @JacksonXmlProperty(localName = "PolicyNo")
        private String policyNo;
        /**
         * 电子保单下载地址
         */
        @JacksonXmlProperty(localName = "Epolicy")
        private String epolicy;

        /**
         * 电子保函下载地址
         */
        @JacksonXmlProperty(localName = "Gpolicy")
        private String gpolicy;
        /**
         * 银行支付流水号 成功且基本户返回
         */
        @JacksonXmlProperty(localName = "PaySerialNumber")
        private String paySerialNumber;

        /**
         * 银行名称
         */
        @JacksonXmlProperty(localName = "PayBankacclocalName")
        private String payBankacclocalName;

        /**
         * 银行账号
         */
        @JacksonXmlProperty(localName = "PayBankaccNo")
        private String payBankaccNo;

        /**
         * 支付时间 yyyy-MM-dd HH:mm:ss
         */
        @JacksonXmlProperty(localName = "PayTime")
        private String payTime;

        /**
         * 支付方式 1:易宝对公支付
         * 2:支票支付
         */
        @JacksonXmlProperty(localName = "PayType")
        private String payType;
    }


}

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值