【问题标题】:How to retrieve field name in case of unmarshalling error in CXF?在 CXF 中出现解组错误时如何检索字段名称?
【发布时间】:2012-05-06 03:59:19
【问题描述】:

前提条件:基于CXF的服务接收到带有数据的请求/响应,违反了XSD限制。

实际行为: 在这种情况下,CXF 会返回错误消息,例如:

cvc-maxLength-valid:长度 = '28' 的值 'string_length_violated_value' 对于类型 'XSDStringTypeWithLengthRestriction' 的 maxLength '13' 不是 facet-valid

目标: 使用包含无效数据的字段名称向消费者返回故障。 F.e.像这样:

来自提供者的响应包含无效数据。字段 'field_name' 的值 'string_length_violated_value' 相对于 maxLength '13' 不是 facet-valid。

我想知道是否可能,如果可能,那么如何确定(从哪里检索)这个字段名称?

【问题讨论】:

  • 我刚刚遇到了一个类似的问题,我得到一个“无效值”解组错误,但除了“违规值”之外,没有任何关于相关元素的提示。由于我在 XML 消息中有数百个元素,这就像大海捞针一样。我在这个阶段的解决方法是为每个元素提供唯一的(虚假的)值,并且由于报告了值(但不是元素),它指向了正确的元素。不过,这很乏味而且不是很聪明。一旦我有更多时间,我将尝试JAXB ValidationEventHandler 技术。
  • 嗨丹尼尔,时间过去了,所以我不记得详细了,抱歉。但我可以说——对我来说ValidationEventHandler 不起作用,因为我们使用的 cxf 版本忽略了这一点。这是个坏消息,但也有好消息——我已经设法通过挖掘封装对象从 cxf 故障中获取有关“坐标”(行号和列号)的数据——这就是我们的解决方案。

标签: cxf field unmarshalling fault


【解决方案1】:

我不确定这是否会完全有效,但您可以尝试一下:

您可以创建一个 JAXB ValidationEventHandler 并将其注册到您的端点上。

它获得的 ValidationEvent 具有基本字符串(如上所示)和其他信息。我会在其中设置一个断点并深入研究事件以查看是否有任何其他有用的信息可用。

【讨论】:

  • 非常感谢我会尝试并告知它是否会带来任何结果!
  • 不幸的是,this source 声明ValidationEventHandler 不允许您更改响应行为,并且您无法更改 SOAP 响应格式。这是真的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 2017-05-26
  • 1970-01-01
  • 2023-04-01
  • 2010-10-19
  • 1970-01-01
相关资源
最近更新 更多