Domanda

In realtà sto sviluppando un servizio Web in Java usando Axis 2. Ho progettato il mio servizio come POJO (Plain Old Java Object) con metodi pubblici che generano eccezioni:

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

Ho quindi generato il WSDL usando il task formica Axis2. Con WSDL ho generato uno stub client per testare il mio servizio. Il codice generato contiene un & Quot; MyExceptionException & Quot; e il " myMethod " nello stub dichiarare di lanciare questo:

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

Ma quando si chiama il metodo circondato da un catch, il " MyExceptionException " non viene mai trasmesso dal server che trasmette invece AxisFault (sottoclasse di RemoteException).

Suppongo che il problema sia lato server ma non trovo dove. Il servizio è distribuito come file aar nella webapp axis2 su un server Tomcat 5.5. Services.xml è simile al seguente:

<?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>

Se il comportamento è normale, abbandonerò l'uso di Exceptions (che non è vitale per il mio progetto) ma sono cauto perché Java2WSDL genera custom < wsdl: fault > in operazione input & amp; dichiarazione di output e WSDL2Java generano una classe Exception (e dichiarano di lanciarla nel metodo stub) se questo non è utilizzabile ...

È stato utile?

Soluzione

Non credo davvero che ci sia un problema. Il tuo client chiama un metodo sul server. Tale metodo comporta un'eccezione. Axis trasforma questa eccezione in qualcosa che può essere inviato al client per indicare l'errore.

Tutte le eccezioni, per quanto ne so, sono racchiuse in un AxisFault che viene quindi trasmesso al client come, credo, un messaggio SoapFault con come descrizione il messaggio di eccezione.

In altre parole, il client dovrebbe vedere solo AxisFaults in quanto l'eccezione (classe di eccezione) non è serializzata e inviata. Le eccezioni del server dovrebbero diventare AxisFaults sul lato client.

Altri suggerimenti

Hai provato ad usare Axis2 con Lady4j, ha risolto questo problema per noi.

Se il WSDL specifica che il servizio genera un errore personalizzato, il client dovrebbe aspettarsi di gestire tali errori e le eccezioni remote generiche generate dall'operazione di Axis2.

Quando lo stub riceve un AxisFault dal server, tenta di creare un'eccezione personalizzata se questa è specificata nel WSDL. In caso contrario, verrà semplicemente eliminato AxisFault.

Lo stub tenterà di chiamare f.getDetail (). Se questo è nullo, non tenterà di costruire un'eccezione personalizzata e passerà AxisFault. Con Axis2 1.5, MessageInOutReciver generato automaticamente sul lato server non imposta questo valore per impostazione predefinita.

Puoi impostarlo manualmente sul lato server in questo modo (supponendo che tu abbia generato automaticamente le classi MyFaultException e MyFault):

        MyFaultException ex = new MyFaultException("My Exception Message");
        MyFault fault = new MyFault();
        fault.setMyFault("My Fault Message");
        ex.setFaultMessage(fault);
        throw ex; 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top