【问题标题】:Best way to configure the output XML version for jaxb via resteasy on jboss通过 jboss 上的 resteasy 为 jaxb 配置输出 XML 版本的最佳方法
【发布时间】:2013-05-25 02:00:29
【问题描述】:

我正在序列化的数据包含 xml 版本 1.0 中不允许的字符:

<value>this &#18; is not good for 1.0</value>

当 RESTEasy 通过 JAXB 对其进行序列化时,它会生成:

<?xml version="1.0" encoding="UTF-8"?>
<value>this &#18; is not good for 1.0</value>

哪些 XML 解析器不会解析为 1.0 不允许该字符,如果我将 xml 版本设置为 1.1 解析器会很高兴。

我可以通过:

transformer.setOutputProperty(OutputKeys.VERSION, "1.1");

所以我想知道的是配置 jboss / resteasy / jaxb 的最佳方法是什么,这样当它创建它使用的转换器时,它就配置了这个输出属性。

【问题讨论】:

  • JAXB (JSR-222) 实现通常不会创建Transformer。您是否希望通过 JAXB impl 影响 XML 输出。
  • @Blaise 很高兴知道,你知道如何查找这种配置的好参考吗?

标签: java xml jboss jaxb resteasy


【解决方案1】:

您可以在Marshaller 上设置以下内容来创建新的标头。

    // Remove the header that JAXB will generate
    marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

    // Grab the encoding that will be used for Marshalling
    String encoding = (String) marshaller.getProperty(Marshaller.JAXB_ENCODING);

    // Specify the new header
    marshaller.setProperty("com.sun.xml.bind.xmlHeaders", "<?xml version=\"1.1\" encoding=\"" + encoding + "\">");

在 JAX-RS 环境中,您可以通过这种方式创建 MessageBodyWriter 来配置 Marshaller。以下对类似问题的回答包括如何执行此操作的示例:

【讨论】:

  • 这很好,但我想配置 resteasy 使其默认执行此操作,而不是为每个 API 入口点手动编写此代码。
  • @Tom - 我不确定你可以。但是,您可以创建一个 MessageBodyWriter 类来处理许多不同的服务。
  • 我让它在独立的情况下工作,但必须将属性设置更改为“com.sun.xml.internal.bind.xmlHeaders”(注意内部)。我还没有弄清楚如何将它放入 marshaller 中以放松身心。
  • 感谢 Tom 和 Blaise ... 最好的办法似乎是涵盖此处概述的两个基础:timepassguys.blogspot.com/2011/12/… ...并且来自球衣框架提交的这个差异似乎也遵循这个找出正确的 xmlheader 键的最佳实践:java.net/projects/jersey/lists/commits/archive/2011-03/message/…
猜你喜欢
  • 2015-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
相关资源
最近更新 更多