Pergunta

Na verdade, estou desenvolvendo um serviço Web em Java usando Eixo 2. Eu projetei o meu serviço como um POJO (Plain Old Java Object) com o Método público exceções jogando:

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

Eu, então, gerou o WSDL usando Axis2 tarefa formiga. Com o WSDL eu gerar um stub cliente para testar o meu serviço. O código gerado contém um "MyExceptionException" eo "myMethod" na declarar stub para jogar isso:

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

Mas ao chamar o método rodeado por um prendedor, o "MyExceptionException" nunca é transmitido pelo servidor que transmitem uma AxisFault vez (subclasse de RemoteException).

Eu assumo o problema está do lado do servidor, mas não encontram onde. O serviço é implantado como um arquivo aar no webapp eixo2 em um servidor tomcat 5.5. Os olhares services.xml como este:

<?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 o comportamento é normal, então eu vou largar o uso de exceções (que não é vital para o meu projeto), mas estou cauteloso porque Java2WSDL gerar personalizado na declaração de entrada e saída de operação e WSDL2Java gerar um classe de exceção (e declarar a jogá-lo no stub) se este não é utilizável ...

Foi útil?

Solução

Eu realmente não acho que há um problema. Seu cliente chama um método no servidor. Esse método resulta em uma exceção. Axis transforma essa exceção para algo que pode ser enviada ao cliente para indicar o erro.

Todas as exceções, tanto quanto eu sei, está envolvida em uma AxisFault que é então transmitido para o cliente como, acredito, uma mensagem SoapFault com a descrição da mensagem de exceção.

Em outras palavras, o cliente só deve ver AxisFaults como exceção (classe de exceção) não é serializado e enviar. exceções do servidor deve se tornar AxisFaults no lado do cliente.

Outras dicas

Você já tentou usando Axis2 com Lady4j, ele resolveu este problema para nós.

Se especificado pelo WSDL que o seu serviço de lançar um erro personalizado o cliente deve esperar para lidar com esses erros, bem como as exceções remotas genéricos lançados pela operação do Axis2.

Quando seu esboço recebe um AxisFault do servidor, ele tenta consturct uma exceção personalizada, se isso for especificado em seu WSDL. Se isso falhar, ele vai simplesmente passar o AxisFault vez.

O stub tentará chamar f.getDetail (). Se este for nulo não vai tentar construir uma exceção personalizada e vai passar o AxisFault. Com Axis2 1.5, o MessageInOutReciver gerada automaticamente na serverside não definir este valor por padrão.

Você pode configurá-lo manualmente na Serverside como este (supondo que você tenha gerado automaticamente aulas MyFaultException e MyFault):

        MyFaultException ex = new MyFaultException("My Exception Message");
        MyFault fault = new MyFault();
        fault.setMyFault("My Fault Message");
        ex.setFaultMessage(fault);
        throw ex; 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top