【问题标题】:JAXB Marshaller initializationJAXB Marshaller 初始化
【发布时间】:2011-12-19 14:01:49
【问题描述】:

我需要将 JAXB 对象编组为 xml 格式字符串。我正在使用 SLSB 并挂钩代码以在 @PostConstruct 注释方法中创建 Marshaller 和其他内容。这样每次我都不需要加载架构并创建 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 格式时,返回相同的最快方法?)。

谢谢

【问题讨论】:

    标签: java xml xml-serialization jaxb marshalling


    【解决方案1】:

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

    参考JAXB Performance and Thread safety

    【讨论】:

    • 将初始化代码挂钩到@PostConstruct 不会导致任何问题,对吧?如果要编组的对象作为参数传递,我的意思是会话在连续调用期间混合在一起?
    • 检查提供的链接。我认为它可能为您的问题提供了更好的答案。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-03-24
      • 1970-01-01
      • 1970-01-01
      • 2015-06-14
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多