I'm using JAXB to unmarshal some http client response with Spring Boot 3.0.8 & Java 17,
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>4.0.3</version>
</dependency>
But when I use @XmlElementWrapper
, I get empty list
here is the complete code :
foo.xml
<foo xmlns='http://ns.fredhopper.com/XML/output/6.1.0' name='hello'>
<bars>
<bar name='hello bar 1'/>
<bar name='hello bar 2'/>
</bars>
</foo>
Foo.java
import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlAttribute;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlElementWrapper;
import jakarta.xml.bind.annotation.XmlRootElement;
import java.util.List;
import lombok.Data;
@Data
@XmlRootElement(name = "foo", namespace = "my-secret-name-space")
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {
@XmlAttribute private String name;
@XmlElementWrapper(name = "bars", namespace = "my-secret-name-space")
@XmlElement(name = "bar")
private List<Bar> bars;
}
Bar.java
import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlAttribute;
import jakarta.xml.bind.annotation.XmlTransient;
import lombok.Data;
@Data
@XmlAccessorType(XmlAccessType.NONE)
public class Bar {
@XmlAttribute private String name;
}
unmarshling code
try (InputStream inputStream = getSomeInputStream()) {
JAXBContext context = JAXBContext.newInstance(Foo.class);
return (Foo) context.createUnmarshaller().unmarshal(inputStream);
}
in my Foo class i got the name attribute correctly initialized, but the bars list is empty