Jakub Znamenáček
Jakub Znamenáček

Reputation: 838

JAXB - unmarshall XML message to list

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

Upvotes: 0

Views: 112

Answers (1)

Thomas Fritsch
Thomas Fritsch

Reputation: 10127

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

Upvotes: 1

Related Questions