我能够绑定复杂的对象(下面的代码中的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的问题。
提前致谢, 维卡斯
答案 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>
}