Javaオブジェクトをxml文字列にマーシャリングしたい。したがって、JAXBクラスを生成するためのスキーマが与えられました。文字列を設定する必要があるsetメソッド(スキーマのhexbinary型の要素に対応)があります。文字列のサイズは約2566です。setterメソッドを使用してオブジェクトにデータを設定した後、stringWriter引数を渡してマーシャラーを呼び出します。
しかし、stringWriterを印刷すると、切り捨てられていることがわかります。2566文字全体が表示されません。
なにが問題ですか?何か案は?
ありがとう!
アップデート:
私は問題を見つけたと思います。問題の推論が間違っていたので、適切なタイトルを見つける必要があります!! 問題は次のとおりです。スキーマに「hexbinary」要素があります。生成されたクラスには、対応するset/getメソッドがあります。値を設定するために、apache commonsパッケージのHexEncodeStringメソッドを使用し、マーシャラーが実際のHexエンコーディングが6869である文字列 "hi"のhexbinaryタグに36383639を表示することに気付きました:(したがって、問題はマーシャリング後のxmlにタグがあります文字数が元の値より大きく、前に思ったように切り捨てられない値!
BlaiseDoughanのコードに感謝します。私はそれを修正し、この問題を再現しました。
最初のスキーマ例:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="Root">
<xs:sequence>
<xs:element name="string" type="xs:string" minOccurs="0"/>
<xs:element name="a" type="xs:hexBinary" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
これを使用して、ObjectFactoryクラスとRootクラスを生成しました。これをマーシャラーに渡すことができるように、JAXBElementを含めるようにObjectFactoryクラスを変更する必要がありました。これらを使用して、Blaise Doughanのデモクラスを取得し、次のように変更しました。
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Root.class);
// The object factory
ObjectFactory objFactory = new ObjectFactory();
Root root = new Root();
String str = new String("hi");
String val = Hex.encodeHexString(str.getBytes());
root.setString(str);
root.setArr(val.getBytes());
System.out.println("val="+val);
System.out.println("getString ="+root.getString());
System.out.println("getArr="+new String(root.getArr()));
// Marshal the object to a StringWriter
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://www.example.com/schema.xsd");
StringWriter stringWriter = new StringWriter();
marshaller.marshal(objFactory.createRoot(root),stringWriter);
// marshaller.marshal(root, stringWriter);
// Convert StringWriter to String
String xml = stringWriter.toString();
System.out.println(xml);
// Unmarshal the XML and check length of long String
Unmarshaller unmarshaller = jc.createUnmarshaller();
Root unmarshalledRoot = (Root) unmarshaller.unmarshal(new StringReader(xml));
System.out.println(root.getString().length());
System.out.println(root.getString());
System.out.println(new String(root.getArr()).length());
System.out.println(new String(root.getArr()));
}
}
私が得る出力は次のとおりです。
val=6869
getString =hi
getArr=6869
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns3:Root xsi:schemaLocation="http://www.example.com/schema.xsd" xmlns:ns3="http://example.com/root" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<string>hi</string>
<arr>36383639</arr>
</ns3:Root>
Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"http://example.com/root", local:"Root"). Expected elements are (none)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:631)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:236)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:231)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:105)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1038)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:467)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:448)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:137)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:501)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:400)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:626)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3103)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:922)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:200)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:173)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:194)
at example.Demo.main(Demo.java:43)
arrタグが6869ではなく36383639なのはなぜですか?