Home > Blockchain >  JAXB - unmarshall XML message to list
JAXB - unmarshall XML message to list

Time:07-31

could someone help me how should my Java class look like when I would like to unmarshall this xml?

<content>
        <status>NACK</status>
        <securitiesFinancingTrade>
            <id version="1" type="originalDealId">999999</id>
        </securitiesFinancingTrade>
        <schemaVersion>Schema1</schemaVersion>
        <error>
            <type>MalformedXML</type>
            <message>Message 1</message>
        </error>
        <error>
            <type>MalformedXML</type>
            <message>Message 2</message>
        </error>
    </content>

Currently I have it like this:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "content", propOrder = {
        "status",
        "securitiesFinancingTrade",
        "schemaVersion",
        "error"
})
public class Content  implements Serializable {

    private final static long serialVersionUID = -1L;
    protected ContentStatusEnumType status;
    protected SecuritiesFinancingTrade securitiesFinancingTrade;
    protected String schemaVersion;
    protected List<Error> error;

    public ContentStatusEnumType getStatus() {
        return status;
    }

    public void setStatus(ContentStatusEnumType status) {
        this.status = status;
    }

    public SecuritiesFinancingTrade getSecuritiesFinancingTrade() {
        return securitiesFinancingTrade;
    }

    public void setSecuritiesFinancingTrade(SecuritiesFinancingTrade securitiesFinancingTrade) {
        this.securitiesFinancingTrade = securitiesFinancingTrade;
    }

    public String getSchemaVersion() {
        return schemaVersion;
    }

    public void setSchemaVersion(String schemaVersion) {
        this.schemaVersion = schemaVersion;
    }

    public List<Error> getError() {
        return error;
    }

    public void setError(List<Error> error) {
        this.error = error;
    }
}

and the Error class looks like this:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "error", propOrder = {
        "type",
        "message"
})
public class Error  implements Serializable {

    private final static long serialVersionUID = -1L;
    @XmlAttribute(name = "type", required = true)
    protected String type;
    @XmlAttribute(name = "message", required = true)
    protected String message;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

I do not receive any unmarshalling error from JAXB, it even puts two errors in the list as expected, but the type and message there are null.

enter image description here

CodePudding user response:

In your class Error you have annoated the properties type and message with @XmlAttribute. That means, you can handle XML input with XML attributes, like this:

<error type="MalformedXML" message="Message"></error>

But actually you have input with XML elements, like this:

<error>
    <type>MalformedXML</type>
    <message>Message 1</message>
</error>

So, in your class Error you need to replace @XmlAttribute by @XmlElement, or just omit it altogether.

After doing this, the <error> parts of your XML input will be unmarshalled correctly.

enter image description here

  • Related