JAXBオブジェクトをXML形式の文字列にマーシャリングする必要があります。私はSLSBを使用しており、コードMarshaller
と他のものを@PostConstruct
の注釈付きメソッドを作成するためにフックしています。そのたびに、スキーマを読み込んでMarshallerを作成する必要はありません。JAXB Marshaller initialization
@PostConstruct
のコードは以下の通りです。
JAXBContext jaxbContext = JAXBContext.newInstance(jaxbPackageName);
SchemaFactory factory = SchemaFactory
.newInstance(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI);
URL schemaUrl = Thread.currentThread().getContextClassLoader()
.getResource(resourcePath);
schema = factory.newSchema(schemaUrl);
setMarshaller(jaxbContext.createMarshaller());
getMarshaller().setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
Boolean.FALSE);
getMarshaller().setSchema(schema);
getMarshaller().setEventHandler(new DefaultValidationEventHandler());
setUnmarshaller(jaxbContext.createUnmarshaller());
getUnmarshaller().setSchema(schema);
getUnmarshaller().setEventHandler(new DefaultValidationEventHandler());
クライアントコードでオブジェクトのxml形式が必要な場合、次のメソッドは同じものを返します。
OutputStream outputStream = new ByteArrayOutputStream();
getMarshaller().setProperty(Marshaller.JAXB_SCHEMA_LOCATION,
schemaLocation);
getMarshaller().marshal(document, outputStream);
xmlString = outputStream.toString();
私の関心は、同じことを行うための任意のより良い方法は、(クライアントコードは、JAXBオブジェクトのXMLフォーマットを取得したいときはいつでも、最速のアプローチは同じを返すために?)があります。
おかげ
@PostConstructの初期化コードをフックすると問題はありません。マーシャリングされるオブジェクトがパラメータとして渡された場合、連続コール中にセッションが混在することを意味しますか? – nobody
提供されたリンクを確認してください。私はおそらくあなたの質問に良い答えを提供すると思います。 – AValchev