【问题标题】:Not able to map field in JAXB unmarshalling, fields getting populated as null无法在 JAXB 解组中映射字段,字段填充为空
【发布时间】:2020-02-06 21:07:10
【问题描述】:

我有一个想要使用 JAXB 转换为 POJO 的 XML,但我无法转换,并且父类中的所有元素都被填充为 null

输入 XML:

<Response>
  <parameters>
    <Id>101</Id>
    <Status>SUCCESS</Status>
  </parameters>
</Response>

FileWriterService.writeMethod()

  JAXBContext context = JAXBContext.newInstance(Response.class);
  Response response = (Response) context.createUnmarshaller().unmarshal(new 
  StringReader(inputXml));
  System.out.println("response: " + response);

输出:

response: ClassPojo [parameters = ClassPojo [Id = null, Status = null]]

Response.java

@XmlRootElement(name="Response")
public class Response {

    private Parameters parameters;

    public Parameters getParameters() {
        return parameters;
    }

    public void setParameters(Parameters parameters) {
        this.parameters = parameters;
    }

    @Override
    public String toString() {
        return "ClassPojo [parameters = " + parameters + "]";
    }

}

Parameters.java

public class Parameters {

    private String Id;
    private String Status;

    public String getId() {
        return Id;
    }

    public void setId(String Id) {
        this.Id = Id;
    }

    public String getStatus() {
        return Status;
    }

    public void setStatus(String Status) {
        this.Status = Status;
    }

    @Override
    public String toString() {
        return "ClassPojo [Id = " + Id + ", Status = " + Status + "]";
    }
}

【问题讨论】:

  • 尝试使用@XmlAttribute(name = "Id") private String id; 和状态@XmlAttribute(name = "Status") private String status; 相同,因为jaxb 使用getter setter 方法。
  • 与您的问题无关,但仍然很重要;不要在每次方法调用时都创建一个新的 JAXBContext,因为它会创建一个 memory leak

标签: java xml spring jaxb


【解决方案1】:

试试@XmlElement注解,这个注解将一个字段映射到一个xml元素

Response.java

@XmlElement
private Parameters parameters;

Parameters.java

@XmlElement
private String Id;
@XmlElement
private String Status;

【讨论】:

    【解决方案2】:

    感谢Lakshan 的指点。实施您的解决方案后,原始问题得到解决,但出现错误相关com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions

    除了您的更改之外,我还必须添加 XmlAccessorType

    @XmlRootElement(name = "Response")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Response {
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-20
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 2012-10-18
      • 2021-11-18
      • 1970-01-01
      相关资源
      最近更新 更多