我正在尝试将一个简单的 POJO 序列化为 AXIOM OMElement,以便与 Axis2 Web 服务一起使用。
POJO 存储一个字符串、一个枚举和一个对象值。
虽然 String 和大多数 Object 值被正确转换为 XML,但 Enum 永远不会序列化(相应的 XML 字段没有值),如果我将值传递给new Object()value 字段,则会发生 NullPointerException。
此外,布尔对象也没有序列化(请参阅示例代码后面的输出)。
是否有任何 AXIOM 不会序列化的类型,或者以下代码是否缺少某些内容?
谢谢!
import java.util.Date;
import javax.xml.stream.XMLStreamReader;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMXMLBuilderFactory;
import org.apache.axiom.om.impl.builder.StAXOMBuilder;
import org.apache.axis2.databinding.utils.BeanUtil;
import org.apache.axis2.util.StreamWrapper;
public class TestField
{
public static enum Type
{
ONE, TWO, THREE;
}
private final String name;
private final Type type;
private final Object value;
public TestField(String name, Type type, Object value)
{
this.name = name;
this.type = type;
this.value = value;
}
public String getName()
{
return this.name;
}
public Type getType()
{
return this.type;
}
public Object getValue()
{
return this.value;
}
public OMElement toXML()
{
XMLStreamReader reader = BeanUtil.getPullParser(this);
StreamWrapper parser = new StreamWrapper(reader);
StAXOMBuilder stAXOMBuilder = (StAXOMBuilder)OMXMLBuilderFactory.
createStAXOMBuilder(
OMAbstractFactory.getOMFactory(), parser);
return stAXOMBuilder.getDocumentElement();
}
public static void main(String[] args)
{
TestField booleanTest = new TestField("boolean", Type.ONE, true);
TestField integerTest = new TestField("integer", Type.TWO, 1000);
TestField floatTest = new TestField("float", Type.TWO, 1.234);
TestField dateTest = new TestField("date", Type.THREE, new Date());
TestField stringTest = new TestField("string", Type.THREE, "Some text");
TestField objectTest = new TestField("object", Type.THREE, new Object());
System.out.println(booleanTest.toXML());
System.out.println(integerTest.toXML());
System.out.println(floatTest.toXML());
System.out.println(dateTest.toXML());
System.out.println(stringTest.toXML());
System.out.println(objectTest.toXML());
}
}
运行上述代码时的输出为:
<TestField><name>boolean</name><type /><value /></TestField>
<TestField><name>integer</name><type /><value>1000</value></TestField>
<TestField><name>float</name><type /><value><infinite>false</infinite><naN>false</naN></value></TestField>
<TestField><name>date</name><type /><value><date>17</date><day>4</day><hours>14</hours><minutes>54</minutes><month>10</month><seconds>15</seconds><time>1321534455006</time><timezoneOffset>-120</timezoneOffset><year>111</year></value></TestField>
<TestField><name>string</name><type /><value>Some text</value></TestField>
对于objectTest,会出现以下异常:
Exception in thread "main" java.lang.NullPointerException
at org.apache.axis2.databinding.utils.BeanUtil.getPropertyQnameList(BeanUtil.java:128)
at org.apache.axis2.databinding.utils.BeanUtil.getPullParser(BeanUtil.java:72)
at org.apache.axis2.databinding.utils.reader.ADBXMLStreamReaderImpl.processProperties(ADBXMLStreamReaderImpl.java:993)
at org.apache.axis2.databinding.utils.reader.ADBXMLStreamReaderImpl.next(ADBXMLStreamReaderImpl.java:850)
at org.apache.axis2.util.StreamWrapper.next(StreamWrapper.java:71)
at org.apache.axiom.om.impl.builder.StAXOMBuilder.parserNext(StAXOMBuilder.java:682)
at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:215)
at org.apache.axiom.om.impl.llom.OMElementImpl.buildNext(OMElementImpl.java:652)
at org.apache.axiom.om.impl.llom.OMNodeImpl.getNextOMSibling(OMNodeImpl.java:122)
at org.apache.axiom.om.impl.llom.OMElementImpl.getNextOMSibling(OMElementImpl.java:342)
at org.apache.axiom.om.impl.traverse.OMChildrenIterator.getNextNode(OMChildrenIterator.java:36)
at org.apache.axiom.om.impl.traverse.OMAbstractIterator.hasNext(OMAbstractIterator.java:69)
at org.apache.axiom.om.impl.util.OMSerializerUtil.serializeChildren(OMSerializerUtil.java:555)
at org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:874)
at org.apache.axiom.om.impl.llom.OMSerializableImpl.serialize(OMSerializableImpl.java:125)
at org.apache.axiom.om.impl.llom.OMSerializableImpl.serialize(OMSerializableImpl.java:113)
at org.apache.axiom.om.impl.llom.OMElementImpl.toString(OMElementImpl.java:997)
at java.lang.String.valueOf(String.java:2826)
at java.io.PrintStream.println(PrintStream.java:771)
at TestField.main(TestField.java:71)