gpt4 book ai didi

java - JAXB 解码返回 null

转载 作者:行者123 更新时间:2023-12-01 12:55:31 25 4
gpt4 key购买 nike

我有一个具有以下结构的类

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({
Child.class
})
public abstract class Parent implements Serializable{}

public class Child extends Parent implements Serializable{


private String attribute;

private List<String> values = new ArrayList<String>() ;
}

因此,在编码(marshal)子对象时,它已成功保存在数据库中:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Child >
<attribute>age</attribute>
<values>1</values>
<values>2</values>
</Child >

问题是在解码该对象时,解码函数返回 null。

JAXB.unmarshal(reader, Parent.class)

您能告诉一下问题是什么以及如何解决吗?

提前致谢

最佳答案

解码时,您必须:

  • 提供标有 @XMLRootElement 的元素作为 XML 的根。
  • 将您的类定义为完全兼容的 Java Bean(通过属性获取/设置方法)。

这是对我有用的代码:Parent.java

package dummy;

import java.io.Serializable;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;

@XmlRootElement
@XmlSeeAlso({
Child.class
})
public abstract class Parent implements Serializable{}

子级(使用一个小的主方法编码和解码相同的有效负载)

package dummy;

import java.io.ByteArrayInputStream;
import java.io.Serializable;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Child extends Parent implements Serializable
{

private String attribute;

private List<String> values = new ArrayList<String>();

/**
* @return the attribute
*/
public String getAttribute()
{
return attribute;
}

/**
* @param attribute
* the attribute to set
*/
public void setAttribute(String attribute)
{
this.attribute = attribute;
}

/**
* @return the values
*/
public List<String> getValues()
{
return values;
}

/**
* @param values
* the values to set
*/
public void setValues(List<String> values)
{
this.values = values;
}

public static void main(String[] args) throws JAXBException
{
JAXBContext context = JAXBContext.newInstance(Parent.class);

Child child = new Child();
child.setAttribute("dummy");
child.setValues(Arrays.asList("value1", "value2"));

StringWriter writer = new StringWriter();

context.createMarshaller().marshal(child, writer);

System.out.println(writer.getBuffer().toString());

Child unmarshalledChild = (Child) context.createUnmarshaller().unmarshal(new ByteArrayInputStream(writer.getBuffer().toString().getBytes()));
System.out.println("attribute: " + unmarshalledChild.attribute);
System.out.println("values: " + unmarshalledChild.values);

}

}

成功输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><child>   <attribute>dummy</attribute><values>value1</values><values>value2</values></child>
attribute: dummy
values: [value1, value2]

关于java - JAXB 解码返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23943100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com