0

我想向我的 JAX-WS Web 服务添加一些 SOAP 错误,但我不想更改 WSDL 模式的内容。据我所知,我必须使用注释 @WebFault 来定义 SOAP Fault,它会在下一次构建期间自动导致 WSDL 发生变化。有没有办法在不改变 WSDL 方案内容的情况下使用 SOAP 错误?

4

2 回答 2

2

当您从代码中抛出异常时,它会在响应中由 JAX-WS 自动映射到 SOAP 错误。无需在 WSDL 中定义错误。

使用@WebFault或定义<soap:fault>WSDL 文件中的元素用于声明特定操作可能返回自定义 SOAP 错误。

@WebFault肯定会<soap:fault>在生成的 WSDL 中添加一个元素。

回顾一下,抛出异常将在soap响应中插入一个元素。

更新

自定义故障字符串:

作为参数传递给Exception构造函数的字符串消息表示<soap:fault>. 例子:

throw new Exception("This is the faultstring text");

导致肥皂响应错误:

<soap:fault>
    <faultcode>soap:Server</faultcode>
    <faultstring>This is the faultstring text</faultstring>
</soap:fault>

自定义故障代码:

我认为您不能使用普通的 Java 异常来更改故障代码。如果您确实需要这样做,可以查看 JAX-WS SOAPFaultException

请记住,故障代码用于指示产生的错误类型,并且大多数情况下您将从 Web 服务返回服务器故障。

这是 SOAP 1.1 和 1.2 中现有的四个故障代码:

  • VersionMismatch:发现 SOAP Envelope 元素的命名空间无效。
  • MustUnderstand:无法理解 Header 元素的直接子元素,mustUnderstand 属性设置为“1”。
  • 客户:消息格式不正确或包含不正确的信息。
  • 服务器:服务器出现问题,因此消息无法继续。

前三个将由 JAX-WS 在解析 SOAP 请求时创建,除非有非常特殊的情况或者您正在编写自己的 JAX-WS 处理程序/拦截器,否则您不需要返回除“服务器”之外的任何其他故障代码。

定制细节:

<detail>元素将填充一个表示异常的元素。例如,如果您正在抛出 a new MyCustomException("custom message"),它将是这样的:

<detail>
    <MyCustomException>
        <message>custom message</message>
    </MyCustomException>
</detail>
于 2015-09-16T13:03:36.330 回答
0

使用 Soap Ui 测试您的 Web 服务。我刚刚测试了我的,在异常中使用自定义消息,当我看到来自 Soap Ui 的响应时,我看到故障字符串有我的自定义消息。

于 2016-09-14T21:13:40.227 回答