【问题标题】:Parsing XML web request with sub-element via @RequestBody通过 @RequestBody 解析带有子元素的 XML Web 请求
【发布时间】:2016-12-08 14:51:26
【问题描述】:

我需要在我的 Spring Boot 应用程序中解析这样的 XML 文档:

<Transaction id="{ID}" vs="{VS}" uniq="{UNIQ}">
<Data field1="{VAL1}" field2="{VAL2}" />
</Transaction>

这是我@RestController中的端点方法

@RequestMapping(value = "/transaction", method = RequestMethod.POST)
    public ApiClient transaction(@RequestBody TransactionRequest transactionRequest) {
        LOGGER.debug(transactionRequest);
        return null;
    }

Transaction 类:

@XmlRootElement(name = "Transaction")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso(TransactionRequestData.class)
public class TransactionRequest {

    @XmlElement(name = "id")
    private long id;

    @XmlElement(name = "vs")
    private String vs;

    @XmlElement(name = "uniq")
    private String uniq;

    @XmlElement(name = "data")
    private TransactionRequestData data;
}

TransactionRequestData

@XmlRootElement(name = "Data")
@XmlAccessorType(XmlAccessType.FIELD)
public class TransactionRequestData {

    @XmlElement(name = "field1")
    private String field1;

    public String getField1() {
        return field1;
    }

    public void setField1(String field1) {
        this.field1 = field1;
    }
}

但这只绑定了Transaction元素数据,但没有绑定Data元素。

有没有办法解析子元素?

【问题讨论】:

    标签: java xml spring spring-boot jaxb


    【解决方案1】:

    id、vs、uniq 属性在您的情况下是 xml 属性。

    使用@XmlAttribute 将TransactionRequest pojo 的@XmlElement 注释更改为正确的属性。

    使用以下内容:

    @XmlRootElement(name = "Transaction")
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlSeeAlso(TransactionRequestData.class)
    public class TransactionRequest {
    
        @XmlAttribute(name = "id")
        private long id;
    
        @XmlAttribute(name = "vs")
        private String vs;
    
        @XmlAttribute(name = "uniq")
        private String uniq;
    
        @XmlElement(name = "data")
        private TransactionRequestData data;
    
        ....getters & setters ommited
    }
    
    
    @XmlRootElement(name = "Data")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class TransactionRequestData {
    
        @XmlAttribute(name = "field1")
        private String field1;
    
        public String getField1() {
            return field1;
        }
    
        public void setField1(String field1) {
            this.field1 = field1;
        }
         ....getters & setters ommited
    }
    

    不要忘记为属性添加 getter 和 setter。

    【讨论】:

    • 我已经更改了它,但TransactionRequest .data 仍然为空。
    • 不,抱歉,id, vs uniq 已填满,但 data 归档仍为空。
    猜你喜欢
    • 2017-10-14
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2011-04-19
    • 2014-04-01
    • 2013-06-17
    相关资源
    最近更新 更多