【问题标题】:JAXB unmarshalling from StringReader to xml with namespaceJAXB 从 StringReader 解组到带有命名空间的 xml
【发布时间】:2021-04-05 23:49:40
【问题描述】:

我有一个ByteArrayInputStream 形式的客户端响应,我正在缓冲读取并创建一个 StringReader 来读取我的 pojo 表单中的 xml。我想解组它,但我遇到了命名空间问题,因此遇到了 JAXBException。

这是我收到回复后的代码:

public void post() {
        ...

        ByteArrayInputStream obj = (ByteArrayInputStream) response.getEntity();
        BufferedReader br = new BufferedReader(new InputStreamReader(obj));
        String line = null;
        StringBuffer sb = new StringBuffer();
        try{
            while ((line = br.readLine()) != null){
                System.out.println(line);
                sb.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        JAXBContext jaxbContext = JAXBContext.newInstance(FileTransmissionResponse.class);
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

        StringReader reader = new StringReader(sb.toString());
        FileTransmissionResponse transmissionResponse = (FileTransmissionResponse) 
        unmarshaller.unmarshal(reader);

}

StringBuffer 响应是下面字符串格式的 xml:

<?xml version="1.0" encoding="UTF-8"?>
<fileTransmissionResponse xmlns="http://abc.xyz.com/schema/auditing/fileResponse-1.1">
   <version>1.0</version>
   <userId>xqas</userId>
   <reNumber>1234</reNumber>
   <reName>1234rfd</reName>
   <status>FAILURE</status>
   <fileName>file.xml</fileName>
   <startTime>2021-04-06T09:16:54.065+10:00</startTime>
   <finishTime>2021-04-06T09:16:54.743+10:00</finishTime>
   <bytesTransferred>15530</bytesTransferred>
   <emailSent>scd@xyz.com</emailSent>
   ....
</fileTransmissionResponse>

POJO 类

package com.example.response;

import javax.xml.bind.annotation.*;
import java.util.List;

@XmlRootElement(name = "fileTransmissionResponse")
@XmlType(propOrder = { "version", "userId", "reNumber", "reName", "status", "fileName", "startTime", "finishTime", "bytesTransferred", "totalRead", "totalTransferred", "totalIntercepted", "emailSent", "message"})
@XmlAccessorType(XmlAccessType.PROPERTY)
public class FileTransmissionResponse {

    private String version;
    private String userId;
    private List<String> reNumber;
    private List<String> reName;
    private int status;
    private List<String> fileName;
    private String startTime;
    private String finishTime;
    private List<Integer> bytesTransferred;
    private List<Integer> totalRead;
    private List<Integer> totalTransferred;
    private List<Integer> totalIntercepted;
    private List<String> austracReference;
    private List<String> emailSent;
    private List<ErrorMessage> message;

    public String getVersion() {
        return version;
    }

    @XmlElement(name = "version")
    public void setVersion(final String version) {
        this.version = version;
    }

    public String getUserId() {
        return userId;
    }

    @XmlElement(name = "userId")
    public void setUserId(final String userId) {
        this.userId = userId;
    }

    public List<String> getReNumber() {
        return reNumber;
    }

    @XmlElement(name = "reNumber")
    public void setReNumber(final List<String> reNumber) {
        this.reNumber = reNumber;
    }

    public List<String> getReName() {
        return reName;
    }

    @XmlElement(name = "reName")
    public void setReName(final List<String> reName) {
        this.reName = reName;
    }

    public int getStatus() {
        return status;
    }

    @XmlElement(name = "status")
    public void setStatus(final int status) {
        this.status = status;
    }

    public List<String> getFileName() {
        return fileName;
    }

    @XmlElement(name = "fileName")
    public void setFileName(final List<String> fileName) {
        this.fileName = fileName;
    }

    public String getStartTime() {
        return startTime;
    }

    @XmlElement(name = "startTime")
    public void setStartTime(final String startTime) {
        this.startTime = startTime;
    }

    public String getFinishTime() {
        return finishTime;
    }

    @XmlElement(name = "finishTime")
    public void setFinishTime(final String finishTime) {
        this.finishTime = finishTime;
    }

    public List<Integer> getBytesTransferred() {
        return bytesTransferred;
    }

    @XmlElement(name = "bytesTransferred")
    public void setBytesTransferred(final List<Integer> bytesTransferred) {
        this.bytesTransferred = bytesTransferred;
    }

    public List<Integer> getTotalRead() {
        return totalRead;
    }

    @XmlElement(name = "totalRead")
    public void setTotalRead(final List<Integer> totalRead) {
        this.totalRead = totalRead;
    }

    public List<Integer> getTotalTransferred() {
        return totalTransferred;
    }

    @XmlElement(name = "totalTransferred")
    public void setTotalTransferred(final List<Integer> totalTransferred) {
        this.totalTransferred = totalTransferred;
    }

    public List<Integer> getTotalIntercepted() {
        return totalIntercepted;
    }

    @XmlElement(name = "totalIntercepted")
    public void setTotalIntercepted(final List<Integer> totalIntercepted) {
        this.totalIntercepted = totalIntercepted;
    }

    public List<String> getEmailSent() {
        return emailSent;
    }

    @XmlElement(name = "emailSent")
    public void setEmailSent(final List<String> emailSent) {
        this.emailSent = emailSent;
    }

    public List<ErrorMessage> getMessage() {
        return message;
    }

    @XmlElement(name = "message")
    public void setMessage(final List<ErrorMessage> message) {
        this.message = message;
    }
}


取消编组调用后,由于 xmlns 命名空间,我收到 JAXB 异常。有什么方法可以避免呢?

【问题讨论】:

    标签: java xml spring jaxb


    【解决方案1】:

    您应该使用FileTransmissionResponse.java 类将package-info.java 文件添加到您的包中并定义xml 架构。

    @XmlSchema(namespace = "http://abc.xyz.com/schema/auditing/fileResponse-1.1",
    elementFormDefault = XmlNsForm.QUALIFIED)
    package com.example.response;
    
    import javax.xml.bind.annotation.XmlNsForm;
    import javax.xml.bind.annotation.XmlSchema;
    

    【讨论】:

    • 谢谢,这行得通。有没有其他选择?
    • 还有一个选项可以为@XmlRootElement@XmlElement定义命名空间参数,但我认为这是最方便的方式。
    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 2011-11-03
    相关资源
    最近更新 更多