原生数据类型的Eclipselink Moxy错误

时间:2014-01-09 11:27:58

标签: eclipselink moxy

我能够绑定复杂的对象(下面的代码中的bs2),但在执行String时遇到错误(下面的代码中为bs1)。使用Eclipselink 2.4.2。请参阅代码:

private static void initJAXBContext() {

String bs1 = "<?xml version=\"1.0\"?>\n" + 
"<xml-bindings\n" + 
"    xmlns=\"http://www.eclipse.org/eclipselink/xsds/persistence/oxm\"\n" + 
"    package-name=\"java.lang\" >\n" + 
"    <xml-schema element-form-default=\"QUALIFIED\" namespace=\"java.lang\">\n" + 
"        <xml-ns prefix=\"sc\" namespace-uri=\"java.lang\"/>\n" + 
"    </xml-schema>\n" + 
"    <java-types>\n" + 
"        <java-type name=\"java.lang.String\">\n" + 
"            <xml-root-element/>\n" + 
"        </java-type>\n" + 
"    </java-types>\n" + 
"</xml-bindings>";

String bs2 = "<?xml version=\"1.0\"?>\n" + 
"<xml-bindings\n" + 
"    xmlns=\"http://www.eclipse.org/eclipselink/xsds/persistence/oxm\"\n" + 
"    package-name=\"test\" >\n" + 
"    <xml-schema element-form-default=\"QUALIFIED\" namespace=\"test\">\n" + 
"        <xml-ns prefix=\"sc\" namespace-uri=\"test\"/>\n" + 
"    </xml-schema>\n" + 
"    <java-types>\n" + 
"        <java-type name=\"test.TestService\">\n" + 
"            <xml-root-element/>\n" + 
"        </java-type>\n" + 
"    </java-types>\n" + 
"</xml-bindings>";

List<Object> fl = new ArrayList<Object>();
Map<String, Object> properties = new HashMap<String, Object>();

try {
  InputStream iStream2 = new ByteArrayInputStream(bs1.getBytes("UTF-8"));
  fl.add(iStream2);

  properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, fl);
  System.out.println("before jaxb");
  JAXBContext context = (org.eclipse.persistence.jaxb.JAXBContext) JAXBContext.newInstance("test", Class.forName("test.TestService").getClassLoader(), properties);
  System.out.println("after jaxb"); 
} catch (Exception e) {
  System.out.println("Exception: " + e);
  e.printStackTrace();
}

}

以上代码适用于bs2。但是为bs1提供了以下例外:

---------------------------------------------------------------------------------------
javax.xml.bind.JAXBException
 - with linked exception:
[java.lang.NullPointerException]
    at org.eclipse.persistence.jaxb.JAXBContext$ContextPathInput.createContextState(JAXBContext.java:915)
    at org.eclipse.persistence.jaxb.JAXBContext$ContextPathInput.createContextState(JAXBContext.java:848)
    at org.eclipse.persistence.jaxb.JAXBContext.<init>(JAXBContext.java:182)
    at org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(JAXBContextFactory.java:129)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:128)
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:249)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:372)
    at GenericTest.initJAXBContext(GenericTest.java:337)
    at GenericTest.main(GenericTest.java:366)
Caused by: java.lang.NullPointerException
    at org.eclipse.persistence.jaxb.compiler.XMLProcessor.processXML(XMLProcessor.java:249)
    at org.eclipse.persistence.jaxb.compiler.Generator.<init>(Generator.java:104)
    at org.eclipse.persistence.jaxb.JAXBContext$ContextPathInput.createContextState(JAXBContext.java:912)
    ... 12 more

---------------------------------------------------------------------------------------

请告诉我绑定字符串bs1的问题。

提前致谢, 维卡斯

1 个答案:

答案 0 :(得分:0)

EclipseLink JAXB (MOXy)不允许您将数据类型视为域对象。以下是将String作为顶级对象进行处理的示例。

import java.io.StringReader;
import javax.xml.bind.*;
import javax.xml.namespace.QName;
import javax.xml.transform.stream.StreamSource;

public class Example {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Example.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        StreamSource xml = new StreamSource(new StringReader("<foo>Hello World</foo>"));
        JAXBElement<String> unmarshalJAXBElement = unmarshaller.unmarshal(xml, String.class);
        String string = unmarshalJAXBElement.getValue();

        System.out.println(string);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        JAXBElement<String> marshalJAXBElement = new JAXBElement<String>(new QName("bar"), String.class, string);
        marshaller.marshal(marshalJAXBElement, System.out);
    }

运行以上代码输出:

Hello World
<?xml version="1.0" encoding="UTF-8"?>
<bar>Hello World</bar>
}