我正在使用 JAXB 通过 Spring Boot 3.0.8 和 Java 17 来解组一些 http 客户端响应,
<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>
但是当我使用
@XmlElementWrapper
时,我得到空列表
这是完整的代码:
foo.xml
<foo xmlns='my-secret-name-space' 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;
}
解组代码
try (InputStream inputStream = getSomeInputStream()) {
JAXBContext context = JAXBContext.newInstance(Foo.class);
return (Foo) context.createUnmarshaller().unmarshal(inputStream);
}
在我的 Foo 类中,我正确初始化了 name 属性,但 bar 列表为空
似乎您只是缺少
@XmlElement
上 bar
的命名空间。
对我来说,当我添加以下内容时,它按预期工作:
@Data
@XmlRootElement(name = "foo", namespace = "http://ns.fredhopper.com/XML/output/6.1.0")
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {
@XmlAttribute private String name;
@XmlElementWrapper(name = "bars", namespace = "http://ns.fredhopper.com/XML/output/6.1.0")
@XmlElement(name = "bar", namespace = "http://ns.fredhopper.com/XML/output/6.1.0")
private List<Bar> bars;
}
我在创建
Foo.class
时使用了JAXBContext
:
JAXBContext context = JAXBContext.newInstance(Foo.class);
foo = (Foo) context.createUnmarshaller().unmarshal(inputStream);