@XmlElementWrapper 生成空列表

问题描述 投票:0回答:1

我正在使用 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 列表为空

java spring spring-boot jaxb
1个回答
1
投票

似乎您只是缺少

@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);
© www.soinside.com 2019 - 2024. All rights reserved.