2011-12-19 60 views
1

我需要將JAXB對象編組爲xml格式字符串。我正在使用SLSB並掛鉤代碼以創建Marshaller和其他東西,並在@PostConstruct註釋的方法中使用。這樣每次我不需要加載模式並創建Marshaller。JAXB Marshaller初始化

@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 2011-12-19 14:34:17

+0

檢查提供的鏈接。我認爲這可能會爲您的問題提供更好的答案。 – AValchev 2011-12-19 14:39:36

1

不直接關係到你的問題,但ByteArrayOutputStream#的toString()將使用平臺的默認字符編碼,而不是創建XML文檔時使用JAXB的編碼。根據您對XML文檔的進一步計劃,將其保留爲字節數組可能會更好,而不是試圖將可能不正確的字符串製作出來。