Java 如何从Axis web服务返回(自定义)SOAPFault?

Java 如何从Axis web服务返回(自定义)SOAPFault?,java,weblogic,axis,weblogic9.x,soapfault,Java,Weblogic,Axis,Weblogic9.x,Soapfault,我有一些WSDL,需要从中生成web服务实现。我正在使用Eclipse和Axis1.4,并在Weblogic9.2上运行 生成服务器存根很顺利,我已经实现了需要的代码。然而,为了与我们正在模拟的现有实现兼容,我需要为某些指定的错误条件返回SOAP错误 也就是说,我需要响应的SOAP主体看起来像以下示例: <soapenv:Body> <soapenv:Fault> <faultcode xmlns:ns1="foobar">ns1:12

我有一些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>

ns1:1234
无法识别提供的参数名称ABCD。
处理web服务[MyService]时出错:未知参数:ABCD
行星
通过(大量)谷歌搜索,我认为我应该能够通过抛出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>

soapenv:Server.userException
java.rmi.RemoteException:我的远程异常;嵌套异常是:
javax.xml.rpc.soap.SOAPFaultException:soap错误字符串
我的主机名
。。。换句话说,它没有导致SOAP错误

我试过很多其他的东西,我几乎被卡住了。那么,有人能告诉我(最好是举个例子)如何在我的环境中使用我可以指定的内容返回SOAP错误响应吗


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

您的第二个代码帖子是SOAP错误(请注意
soapenv:fault
中的
soapenv:Body

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

请参见轴1异常上的文档:

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

许多人将使用fault detail字段,并使用DOM在其中序列化他们自己的XML类型

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


所有这些框架都使用WSS4J实现其web服务安全性,并且可以支持标准的用户名令牌、x509令牌等。不过,一旦您获得来回传递的基本消息,您可能就必须了解WS-security的详细信息。

谢谢。我设法错过了,那是肥皂的毛病。我不完全清楚如何在其中获取自己的信息,尽管据我所知,我只能在方法中引发RemoteException——因此我可以构建AxisException,但我不知道如何抛出它。。。。不管怎么说,去做更多的实验吧。在Axis1时代,是的,我同意,但是尽管玩了很多东西,我从来没有在Axis2上获得过身份验证,我也找不到任何关于使用CXF引发SOAPFaults的详细信息。Weblogic9.2(我一直坚持使用)是Java1.5,因此直接的JAX-WS选项也在您的链接页面中被去掉了。D'dh:“公共类AxisFault扩展了java.rmi.RemoteException”。我要去做实验…实验成功了。在AxisFault中加入一些精心编制的XML以获取细节,效果非常好。谢谢