我需要将JAXB对象编组为xml格式字符串。我正在使用SLSB并挂钩代码以在Marshaller
带注释的方法中创建@PostConstruct
和其他内容。这样每次我都不需要加载模式并创建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格式时,返回相同的最快方法?)。
由于
答案 0 :(得分:3)
我不知道使用JAXB进行编组/解组的任何其他方法。当我遇到同样的问题时,我检查了CXF代码并且它是相同的。
答案 1 :(得分:1)
与您的问题没有直接关系,但是ByteArrayOutputStream #toString()将使用平台的默认字符编码,而不是创建XML文档时JAXB使用的编码。根据您对XML文档的进一步计划,最好将其保留为字节数组,而不是尝试从中生成可能不正确的String。