2011-12-19 13 views
1

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フォーマットを取得したいときはいつでも、最速のアプローチは同じを返すために?)があります。

おかげ

答えて

3

私はJAXBとアンマーシャリング/マーシャリングの他の方法を知りません。同じ問題が発生したときにCXFコードをチェックしたところ、同じでした。

)を直接あなたの質問に関連していないJAXB Performance and Thread safety

+0

@PostConstructの初期化コードをフックすると問題はありません。マーシャリングされるオブジェクトがパラメータとして渡された場合、連続コール中にセッションが混在することを意味しますか? – nobody

+0

提供されたリンクを確認してください。私はおそらくあなたの質問に良い答えを提供すると思います。 – AValchev

1

を参照してください、しかしByteArrayOutputStream#のtoString(プラットフォームのデフォルトの文字エンコーディングではなく、XML文書を作成する際にJAXBで使用されるエンコーディングを使用します。 XML文書の今後の計画に応じて、誤った文字列を出そうとするのではなく、バイト配列として保管する方が良いかもしれません。

関連する問題