CXF 中的格式化 XML 输出?

2023-11-25

我知道如何在使用 Marshaller 时打开格式。但我正在使用 Apache CXF (JAX-RS) 并返回类似的响应return Response.ok(entity).build();.

我还没有找到任何如何格式化输出的选项。我该怎么做?


首先,获得 XML 格式化输出的方法是在编组器上设置正确的属性(与 CXF 一起使用时通常是 JAXB,这是可以的,因为 JAXB 的工作值得称赞)。也就是说,在某个地方你将会有一些事情来做这样的事情:

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

问题是你不一定想要拥有all输出格式化;它增加了相当多的开销。幸运的是,您已经生成了一个明确的Response,所以我们可以使用它的更多功能:

Marshaller marshaller = JAXBContext.newInstance(entity.getClass()).createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
StringWriter sw = new StringWriter();
marshaller.marshal(entity, sw);

return Response.ok(sw.toString(), MediaType.APPLICATION_XML_TYPE).build();

另一种方法在这个 JIRA 问题(本身已关闭,但这对您来说并不是什么大问题):

解决方法是注册一个自定义输出处理程序,它可以检查用于请求可选缩进的任何自定义查询:

http://svn.apache.org/repos/asf/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/FormatResponseHandler.java

JAXBElementProvider 和 JSONProvider 由 JAXB Marshaller 驱动,因此默认情况下它们检查当前消息的 Marshaller.JAXB_FORMATTED_OUTPUT 属性。

这导致代码如下:

public class FormattedJAXBInterceptor extends AbstractPhaseInterceptor<Message> {
    public FormattedJAXBInterceptor() {
        super(Phase.PRE_STREAM);
    }

    public void handleMessage(Message message) {
        message.put(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
    }

    public void handleFault(Message message) {
        message.put(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
    }
}

CXF 网站讨论拦截器的注册.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CXF 中的格式化 XML 输出? 的相关文章

随机推荐

  • 如何获取谷歌地图位置名称?

    我正在建立一个网站 需要获取所有谷歌地图位置 从国家名称到最小的村庄 这是api中的任何地方吗 因为它无处可寻 您需要解析响应以获取该数据 例如 如果您想获取国家 地区 结果是通过调用反向地理编码获得的结果对象 https develope
  • Xcode 9.1(和 9.2) - 引用的精灵不执行场景编辑器中添加的操作

    我在使用 SpriteKit 场景编辑器时遇到了一些意外的行为 想知道其他人是否也遇到同样的问题 我在场景中创建了一个精灵 并添加了动作以使用场景编辑器移动它 当我单击编辑器上的动画按钮时 动作运行良好 我使用场景编辑器中的 SKRefer
  • Delphi:如何在外部应用程序上正确使用ShowWindow [重复]

    这个问题在这里已经有答案了 也可以看看 如何判断我的程序的另一个实例是否已经在运行 我在启动应用程序之前使用以下代码来检查是否有另一个实例 其中已经开始 var PreviousHandle THandle begin PreviousHa
  • 适用于 .NET Framework 3.5 的 WebApi HttpClient [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 Net Framework 3 5 有可用的 WebApi 包吗 我特别期待使用 WebApi 的 HttpClient 组件 有没有适用于 Net
  • 泛型内存管理

    我对如何管理强类型泛型的内存有疑问 List
  • 为什么变量不更新?

    我目前正在编辑 AD 的新员工脚本 遇到了一个问题 我为主文件夹添加了 2 个单选按钮 一个单选按钮会将 BaseHomeFolderPath 更新为 Path1 第二个单选按钮会将其更新为 Path2 我导出变量到 csv 以验证它是否有
  • Spring 3.1中如何使用通配符加载xml资源文件

    我想加载 xml 文件 其中包含 Spring Maven 项目中多个模块的一些错误定义 我想加载文件 然后将其传递给 JAXB unmasheller 这就是我到目前为止所做的 String path classpath definiti
  • GC(分配失败)VS OutOfMemoryError异常

    内存不足错误 通常 当 Java 堆中没有足够的空间来分配对象时 会抛出此错误 GC 分配失败 分配失败 意味着存在大于年轻代可用空间的分配请求 这是否意味着年轻代内存已满 Minor GC 时会抛出Allocation Failure 而
  • BigQuery 通过查询获取表架构

    是否可以通过查询获取 BigQuery 表架构信息 就像是TABLES但对于模式 对 cli 方法不感兴趣 我想要实现的是在 2 个 BQ 表 比方说暂存和生产 之间执行 增量 更新 其具有基于 1 个 键 列的相同结构 但采用自动方式来创
  • 防止页面在新选项卡/窗口中打开

    我正在开发一个项目 当用户在新选项卡或新窗口中打开页面时 该项目的行为非常奇怪 导致应用程序崩溃 我需要一些 javascript 来帮助我防止这种情况 所以基本上我想阻止 ctrl 单击 鼠标中键 shift 单击 从上下文菜单在新选项卡
  • SQL 查找违反 UNIQUE 共同索引的行

    我想在表中的两个 或更多 列上放置唯一索引 但我得到 找到重复的键 如何选择那些导致重复的行 您可以使用Group By and Having为了这 SELECT col1 col2 FROM table GROUP BY col1 col
  • Github:权限被拒绝(公钥),但我收到“您已成功通过身份验证”消息

    我所做的步骤 https help github com articles generate ssh keys 完全遵循 eval ssh agent s Agent pid 31944 ssh add Enter passphrase f
  • 与 Mac 和 Linux 上的 exp 函数的结果略有不同

    以下 C 程序在我的 Mac 和 Linux 上产生不同的结果 我很惊讶 因为我认为实施libm以某种方式标准化 include
  • 使用 Exchangelib 将电子邮件标记为已读

    我正在使用Pythonexchangelib包裹 如何使用 Exchangelib 将电子邮件标记为已读 我已经看过了官方 GitHub Exchangelib 页面对于我的查询 但没有找到答案 要添加到 joe 的评论 您还必须 保存 该
  • Java Spring Boot 中的服务器端渲染 React

    我是服务器端渲染的新手 我想在服务器端渲染 React 组件并以 html 形式传递它 我按照本教程进行操作https spring io guides tutorials react and spring data rest 它仍在客户端
  • .NET 和 C# 初学者书籍? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我想做一个项目 使用 NE
  • GUI 元素在调整窗口大小之前不会显示

    我一直在尝试用 java 制作 GUI 而不是一直使用 静态 并遇到了 SwingUtilities invokeLater 方法 我设法完成所有设置 但在运行应用程序时 JPanel 上什么也没有出现 直到我调整窗口大小 有解决这个问题的
  • make:并行运行多个任务并等待完成

    我的 makefile 中的一个目标是一项非常消耗 CPU 和时间的任务 但我可以拆分工作负载并并行运行该任务多次 以加快整个过程 我的问题是 make 不会等待所有进程完成 考虑这个简单的脚本 名为myTask sh bin bash e
  • 通过标准 JDK 11 使用 graalvm

    我有一个项目使用 Nashorn Javascript 引擎 我正在尝试迁移到 java11 并从 Nashorn 迁移到 Graal 我读了here我可以通过从 JDK 11 开始的标准 JDK 安装来使用 graal 此外 我还读到 G
  • CXF 中的格式化 XML 输出?

    我知道如何在使用 Marshaller 时打开格式 但我正在使用 Apache CXF JAX RS 并返回类似的响应return Response ok entity build 我还没有找到任何如何格式化输出的选项 我该怎么做 首先 获