2015-09-15 61 views
0

我想将一些SOAP错误添加到我的JAX-WS Web服务中,但我不想更改WSDL模式的内容。据我所知,我将不得不使用annotation @WebFault来定义SOAP Fault,并在下一次构建时自动导致WSDL中的更改。有没有办法在不更改WSDL方案内容的情况下使用SOAP Faults?在不更改WSDL文件的情况下添加soap故障?

回答

2

当您从您的代码中抛出异常时,它将在响应中由JAX-WS自动映射到SOAP错误。没有必要在WSDL中定义错误。

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

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

回顾一下,抛出异常会在肥皂响应中插入一个元素。

更新

定制faultstring:

,你作为参数传递给Exception构造函数的字符串消息表示在<soap:fault>的faultstring元素。例如:在SOAP响应

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

由此造成的故障:

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

自定义的faultcode:

我不认为你可以改变正常的Java异常在faultcode。如果您确实需要这样做,您可以查看JAX-WS SOAPFaultException

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

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

  • VersionMismatch:发现SOAP Envelope元素的无效命名空间。
  • 必须了解:Heading元素的直接子元素(其mustUnderstand属性设置为“1”)不被理解。
  • 客户端:邮件格式不正确或包含不正确的信息。
  • 服务器:服务器出现问题,消息无法继续处理。

前三打算解析SOAP请求时,除非有一个非常具体的情况,或者你正在编写自己的JAX-WS处理程序/拦截器,你将不再需要返回任何其他要通过JAX-WS创建“服务器”以外的错误代码。

定制细节:

<detail>元件将与表示所述异常的元素来填充。因为如果你扔一个new MyCustomException("custom message")例如,它会是这样的:

<detail> 
    <MyCustomException> 
     <message>custom message</message> 
    </MyCustomException> 
</detail> 
+0

好吧,但是如果我想更改faultcode和faultstring呢? – ctomek

+0

我更新了答案。您可以使用java Exceptions自定义faultstring,但不能使用faultcode。 –

+0

如果我抛出检查的异常,那么我必须通过添加“throws”子句来更改我的webmethod的签名,因此我将不得不更改我的web方法的接口,以便不会在Web服务中做大的更改就抛出检查的异常接口。正如我发现的那样,我必须抛出未经检查的异常。但是当我抛出RuntimeException它仍然不能按预期工作时,我抛出未经检查的异常“抛出新的RuntimeException(”test“);”而faultstring是“内部错误”而不是“测试”。有任何想法吗? – ctomek

0

使用SOAP UI测试您的Web服务。我只是在异常中使用自定义消息进行了测试,当我看到Soap Ui的响应时,我看到Fault String具有我的自定义消息。

相关问题