2

我正在尝试将一个简单的 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)
4

0 回答 0