Spring RestTemplate 无法解组包含“”的 XML

2023-12-27

我调用第三方提供的旧网络服务。我正在使用春天RestTemplate:

HttpEntity<MyRequest> requestHttpEntity = new HttpEntity<>(requestBody, headers);
MyResponse response = restTemplate.postForEntity(url, requestHttpEntity, MyResponse.class);

我收到一个 XML(我无法影响其格式,它是第三方服务)作为响应:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE MyResponse SYSTEM "http://example.com:8080/some/path/MyResponse.dtd">

<MyResponse>
    ...
</MyResponse>

The postForEntity()方法抛出异常

org.springframework.web.client.RestClientException: 
    Error while extracting response for type [class com.example.MyResponse] and content type [text/xml;charset=ISO-8859-1];
nested exception is org.springframework.http.converter.HttpMessageNotReadableException: 
    Could not unmarshal to [class com.example.MyResponse]: null;
nested exception is javax.xml.bind.UnmarshalException

- with linked exception:
     [org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 10;
     DOCTYPE is disallowed when the feature
     "http://apache.org/xml/features/disallow-doctype-decl" set to true.]

我发现唯一合理的参考http://apache.org/xml/features/disallow-doctype-decl这里的特点:https://xerces.apache.org/xerces2-j/features.html#disallow-doctype-decl https://xerces.apache.org/xerces2-j/features.html#disallow-doctype-decl

问题:如何在不完全避免 Spring RestTemplate 的自动行为的情况下自定义解组?我想强制解组器接受包含具有 DTD 引用的元素的 XML。

这个问题与我的另一个问题密切相关如何在 Spring RestTemplate 中自定义自动封送处理以生成/修改 XML 标头(编码、DOCTYPE) https://stackoverflow.com/q/47836310/2886891,但是那里提出的解决方案在这里并不容易适用。


默认情况下Jaxb2RootElementHttpMessageConverter https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/converter/xml/Jaxb2RootElementHttpMessageConverter.html#setSupportDtd-boolean-禁用 DTD 支持(以及 XML 实体支持)。这样做的原因是它具有安全隐患,请参阅SPR-11376 https://jira.spring.io/browse/SPR-11376.

要在Jaxb2RootElementHttpMessageConverter https://jira.spring.io/browse/SPR-11376你可以设置supportDtd财产给true再次启用它。但请注意,这也会带来一些潜在的安全问题!

@Bean
public Jaxb2RootElementHttpMessageConverter jaxb2RootElementHttpMessageConverter() {
    Jaxb2RootElementHttpMessageConverter converter = new Jaxb2RootElementHttpMessageConverter();
    converter.setSupportDtd(true);
    return converter;
}

这应该足以(重新)配置支持,而无需添加任何其他配置。要记住的一件事是,这将配置全局可用的Jaxb2RootElementHttpMessageConverter因此将影响所有控制器和RestTemplate您可能想使用。

除了这样做之外,您还可以使用RestTemplateBuilder创建实例时应该使用它RestTemplate只影响特定的RestTemplate.

@Bean
public RestTemplate yourRestTemplate(RestTemplateBuilder builder) {
    Jaxb2RootElementHttpMessageConverter converter = new Jaxb2RootElementHttpMessageConverter();
    converter.setSupportDtd(true);

    return builder.messageConverters(converter).build()
}

通过这种方式,您可以针对该实例进行特定配置RestTemplate并配置你喜欢的。

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

Spring RestTemplate 无法解组包含“”的 XML 的相关文章

随机推荐

  • 如何在 XSLT 1.0 中查找当前日期

    我在检索 XSLT 代码中的当前日期时遇到麻烦 我正在使用 1 0 版和 MSXSL exe 应用程序来触发我的 xslt 代码 我尝试使用以下代码行来实现此功能 但它不起作用 貌似1 0版本不支持当前日期功能 您能否提供适用于 xslt
  • 在 JavaScript 中检查文本框值是字符串还是数字

    基本上我有以下代码
  • ld:重复符号

    我正在做一个学校项目 我从 Xcode 中收到一些奇怪的错误 我正在使用 TextMate 的 Command R 功能来编译该项目 编译似乎工作正常 但链接失败并出现我不明白的错误消息 ld输出 ld path final build f
  • 在 Kivy 中创建动态绘制的线条

    这是我的帖子的延续 在 Kivy 中使用和移动小部件 按钮 https stackoverflow com questions 25273046 using and moving widgets buttons in kivy 我想在 Ki
  • 如何在 statefulset 中设置 kubernetes pod 的主机名

    我正在使用 Statefulset 并且启动了多个 Pod 但它们不是彼此的复制品 我想设置 pod 的主机名 并将这些主机名作为环境变量传递给所有 pod 以便它们可以相互通信 我尝试在 pod 规范下使用主机名 但主机名永远不会设置为指
  • CUDA 共享内存问题(以及将 CUDA 与 python/ctypes 一起使用)

    不知怎的 当我修改时d updated water flow map在下面的代码中 d terrain height map也被修改 相反 更改两个数组的分配顺序可以解决问题 但我认为这只是掩盖了问题的根本原因 cudaCheck cuda
  • 此 for 循环的时间复杂度: for (i = 2; i < N; i = i * i)?

    我们现在正在学习时间复杂度 而我在这个例子中遇到了很多麻烦 for i 2 i lt n i i i do something 教授说这是 O sqrt N 但我不确定我是否相信 毕竟 如果 N 16 它只运行 2 次 而不是 4 次 对吧
  • 在升级之前如何查看 npm 包的发行说明?

    npm 注册表是否以标准化方式公开发行说明 我在以下位置看到过发行说明 自述文件 md 在 GitHub 上作为标记版本 没有描述 在 GitHub 上作为带有描述的标记版本 虽然 SemVer 至少让我知道是否有重大更改 但如果能够查看软
  • Magento db连接参数不会改变,疯狂缓存?

    我已将整个 www 目录从 Web 服务器复制到我的本地工作站 我正在尝试让 Magento 连接到本地数据库 是的 我更改了 magento app etc local xml 文件中的连接字符串值 我已经验证了大约一百次 它已经被改变了
  • C++:使用显式指定引用类型作为类型参数的模板函数

    我正在玩 C 模板类型推导并成功编译了这个小程序 template
  • Actionscript 3 克隆影片剪辑

    我们如何克隆 实例名称 的副本 多谢你们 test close是我在画布上绘制的实例名称 var cloneMe MovieClip new MovieClip cloneMe graphics copyFrom test clone gr
  • Windows Phone 8 - 流式传输 Podcast MP3 文件

    我正在创建一个应用程序 该应用程序读取单个播客提要 该应用程序独有 并在LongListSelector 我可以通过解析 RSS 文件来获取每集的 MP3 URI 我想添加这样的功能 当用户点击列表中的某个项目时 URI 会传递到音频流媒体
  • 可扩展列表视图 setOnChildClickListener 不起作用

    我正在使用可扩展的列表视图 我在onceate方法中给出了setOnChildClickListener 但 setOnChildClickListener 不起作用 我正在寻找解决方案 但我找不到任何解决方案 这里给出我所做的 publi
  • 如何使用 jQuery 防止双击?

    我有一个这样的按钮
  • 通过google BigQuery将unsigned int转换为signed int

    我尝试在 google BigQuery api 上运行查询并得到如下异常 函数 IF 中的参数类型不匹配 distinctPlayers 的类型为 TYPE UINT64 0 的类型为 TYPE INT32 查询太大 所以我只写了失败的部
  • 正则表达式中的否定

    我想在 JavaScript 中使用正则表达式进行表单输入验证 这些是一个字符串 不应包含 或我提到的任何特定字符集 如果字符串不包含这些字符 则测试应该通过 那么我如何在正则表达式中指定没有 char Example stringX vi
  • 如何获取字符串中的字符数

    Go中如何获取字符串的字符数 例如 如果我有一个字符串 hello 该方法应该返回5 我看到了len str 返回字节数and not字符数所以len 返回 2 而不是 1 因为 在 UTF 8 中使用两个字节进行编码 你可以试试RuneC
  • jQuery:日期选择器替代方案

    有没有比 jQuery 日期选择器更好 更小的替代品 ui datepicker js 有应用程序 70kb 在我看来是相当大的了 可以压缩吗 我知道的最好的选择是凯尔文 拉克的日期选择器 http www kelvinluck com a
  • Python函数求等边三角形的一点

    我正在尝试写一个函数equilateral x y 这需要两个np ndarrays of shape N 其中 x 和 y 是自然数并返回点 zan np ndarray of shape N 这样 x y z 是等边三角形的顶点 有哪位
  • Spring RestTemplate 无法解组包含“”的 XML

    我调用第三方提供的旧网络服务 我正在使用春天RestTemplate HttpEntity