【问题标题】:Web Service throwing exception using Axis2 Java使用 Axis2 Java 的 Web 服务抛出异常
【发布时间】:2010-09-16 13:12:00
【问题描述】:

我实际上是在使用 Axis 2 用 Ja​​va 开发 Web 服务。 我将我的服务设计为一个带有公共方法抛出异常的 POJO(普通旧 Java 对象):

public class MyService {
   public Object myMethod() throws MyException {
        [...]
   }
}

然后我使用 Axis2 ant 任务生成了 WSDL。使用 WSDL,我生成了一个客户端存根来测试我的服务。生成的代码在存根声明中包含“MyExceptionException”和“myMethod”以抛出:

public class MyServiceStub extends org.apache.axis2.client.Stub {
    [...]
    public MyServiceStub.MyMethodResponse myMethod(MyServiceStub.MyMethod myMethod)
    throws java.rmi.RemoteException, MyExceptionException0 {
        [...]
    }
    [...]
}

但是当调用被catch包围的方法时,“MyExceptionException”永远不会被传输AxisFault的服务器传输(RemoteException的子类)。

我认为问题出在服务器端,但找不到位置。该服务作为 aar 文件部署在 Tomcat 5.5 服务器上的axis2 webapp 中。 services.xml 看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<service name="MyService" scope="application">
    <description></description>
    <messageReceivers>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" 
            class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
           class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
    </messageReceivers>
    <parameter name="ServiceClass">MyService</parameter>
    <parameter name="ServiceTCCL">composite</parameter>
</service>

如果行为正常,那么我将放弃使用异常(这对我的项目来说并不重要),但我很谨慎为什么 Java2WSDL 在操作输入和输出声明中生成自定义 并且 WSDL2Java 生成一个异常类(并声明在存根方法中抛出)如果这不可用...

【问题讨论】:

    标签: java web-services exception axis


    【解决方案1】:

    我真的不认为有问题。您的客户端调用服务器上的方法。该方法导致异常。 Axis 将此异常转换为可以发送给客户端以指示错误的内容。

    据我所知,所有异常都被包装到一个 AxisFault 中,然后我相信它会作为 SoapFault 消息传输给客户端,并带有异常消息的描述。

    换句话说,客户端应该只看到AxisFaults,因为异常(异常类)没有被序列化和发送。服务器异常应成为客户端的 AxisFaults。

    【讨论】:

    • 在服务器端生成的代码中,它生成一个 AxisFault 并向 SOAP 上下文添加一个 org.apache.axis2.Constants.FAULT_NAME 以映射 WSDL 中的自定义故障...
    • 在客户端存根中,问题似乎是 org.apache.axiom.om.OMElement faultElt = f.getDetail();返回 null...因此存根无法将轴故障映射到自定义 java 异常(从 WSDL 生成)...
    • 对我来说似乎是一个错误。如果一个方法显式声明了它的异常,那么这些异常应该被序列化并相应地传输。甚至 Eclipse 轴 Web 服务客户端生成器也会在客户端生成异常类。海事组织
    【解决方案2】:

    您是否尝试过将 Axis2 与 Lady4j 一起使用,它为我们解决了这个问题。

    【讨论】:

    • lady4j 在这里如何提供帮助?
    【解决方案3】:

    如果您的 WSDL 指定您的服务引发自定义错误,您的客户端应该期望处理这些错误以及 Axis2 操作引发的一般远程异常。

    当您的存根从服务器接收到 AxisFault 时,如果在您的 WSDL 中指定,它会尝试构建自定义异常。如果失败,它只会传递 AxisFault。

    存根将尝试调用 f.getDetail()。如果为 null,则不会尝试构造自定义异常,并将传递 AxisFault。使用 Axis2 1.5,服务器端自动生成的 MessageInOutReciver 默认不设置此值。

    您可以像这样在服务器端手动设置它(假设您已自动生成 MyFaultException 和 MyFault 类):

            MyFaultException ex = new MyFaultException("My Exception Message");
            MyFault fault = new MyFault();
            fault.setMyFault("My Fault Message");
            ex.setFaultMessage(fault);
            throw ex; 
    

    【讨论】:

    • MyFaultException 必须扩展什么类才能访问 setFaultMessage?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 2012-08-09
    相关资源
    最近更新 更多