JAXB Marshaller初始化

时间:2011-12-19 14:01:50

标签: java xml xml-serialization jaxb marshalling

我需要将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格式时,返回相同的最快方法?)。

由于

2 个答案:

答案 0 :(得分:3)

我不知道使用JAXB进行编组/解组的任何其他方法。当我遇到同样的问题时,我检查了CXF代码并且它是相同的。

请参阅JAXB Performance and Thread safety

答案 1 :(得分:1)

与您的问题没有直接关系,但是ByteArrayOutputStream #toString()将使用平台的默认字符编码,而不是创建XML文档时JAXB使用的编码。根据您对XML文档的进一步计划,最好将其保留为字节数组,而不是尝试从中生成可能不正确的String。