6

我有一些 WSDL,需要从中生成 Web 服务实现。我正在使用 Eclipse 和 Axis1.4,并在 Weblogic9.2 上运行。

生成服务器存根很好,我已经实现了我需要的代码。但是,为了与我们正在模拟的现有实现兼容,我需要针对某些指定的错误条件返回 SOAP 错误。

也就是说,我需要响应的 SOAP 主体看起来像这个例子:

<soapenv:Body>
    <soapenv:Fault>
        <faultcode xmlns:ns1="foobar">ns1:1234</faultcode>
        <faultstring>The supplied parameter name ABCD is not recognised.</faultstring>
        <detail>
            <FaultDetail>An error processing the web service [MyService]: Unknown parameter:ABCD</FaultDetail>
            <ns2:hostname xmlns:ns2="http://xml.apache.org/axis/">planet</ns2:hostname>
        </detail>
    </soapenv:Fault>
</soapenv:Body>

通过(大量)谷歌搜索,我认为我应该能够通过抛出 SOAPFaultException 来做到这一点。但是消息存根只抛出 java.rmi.RemoteException,所以我尝试将 SOAPFaultException 传递给 RemoteException。这给了我这样的东西:

   <soapenv:Body>
      <soapenv:Fault>
         <faultcode>soapenv:Server.userException</faultcode>
         <faultstring>java.rmi.RemoteException: My remote exception; nested exception is: 
    javax.xml.rpc.soap.SOAPFaultException: soap fault string</faultstring>
         <detail>
            <ns1:hostname xmlns:ns1="http://xml.apache.org/axis/">myhostname</ns1:hostname>
         </detail>
      </soapenv:Fault>
   </soapenv:Body>

... 换句话说,它没有导致 SOAP 错误。

我已经尝试了很多其他的东西,我几乎被卡住了。那么有人可以告诉我(最好有一个例子)如何在我的环境中返回一个包含我可以指定的内容的 SOAP 错误响应?

我并不热衷于使用 Axis(但我在这方面的经验比其他任何事情都多)。如果您建议替代方案,请注意我需要在 Web 服务方法中调用另一个(经过身份验证的)Web 服务,而我只能在 Axis1.4 中使用它...

4

1 回答 1

3

您的第二个代码帖子是 SOAP 错误(请注意soapenv:Fault内部soapenv:Body)。

基本上所有框架的默认行为都是返回标准 SOAP 故障,并让您能够在故障代码、故障字符串和故障详细信息字段中输入您自己的信息。

请参阅有关 Axis 1 异常的文档:http ://ws.apache.org/axis/java/apiDocs/org/apache/axis/AxisFault.html

它具有用于设置各种字段的 qname 的构造函数,因此您应该能够在那里引用自己的项目。

许多人会使用故障详细信息字段并使用 DOM 在其中序列化自己的 XML 类型。

最后但并非最不重要的一点是 Axis1 的黄金时间大约是 2000-2004 年,您会发现很难获得答案和支持。大多数人已经从 Axis1 迁移到Apache CXFAxis2,或者直接迁移到
JAX-WS(现在包含在 JDK6+ 中)。还有Spring Web Services项目,它提供堆栈中所有行为的完全定制(编组、执行哪个 bean 等)。

只是所有这些框架都使用 WSS4J 来确保它们的 Web 服务安全性,并且可以支持标准的用户名令牌、x509令牌等。然而,一旦你得到了来回传递的基本消息,你可能不得不处理细节WS-安全性。

于 2011-06-12T17:03:02.123 回答