2008-10-10 10 views
2

Je développe actuellement un service Web en Java en utilisant Axis 2. J'ai conçu mon service comme POJO (Plain Old Java Object) avec méthode publique de lancer des exceptions:Web Service lancer exception en utilisant Axis2 Java

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

J'ai ensuite généré le WSDL en utilisant la tâche Axis2 ant. Avec le WSDL, je génère un talon de client pour tester mon service. Le code généré contient un « MyExceptionException » et le « myMethod » dans le déclarer stub jeter ceci:

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

Mais lorsque vous appelez la méthode entourée d'une prise, le « MyExceptionException » n'est jamais transmis par le serveur qui transmet un AxisFault à la place (sous-classe de RemoteException).

Je suppose que le problème est côté serveur mais ne trouve pas où. Le service est déployé en tant que fichier aar dans la webapp axis2 sur un serveur Tomcat 5.5. Le services.xml ressemble à ceci:

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

Si le comportement est normal alors je vais laisser tomber l'utilisation des exceptions (ce qui est essentiel à mon projet) mais je suis circonspect pourquoi Java2WSDL générer la coutume < wsdl: défaut > dans l'entrée de l'opération & la déclaration de sortie et WSDL2Java génèrent une classe Exception (et déclarent la lancer dans la méthode stub) si cela n'est pas utilisable ...

Répondre

4

Je ne pense pas vraiment qu'il y ait un problème. Votre client appelle une méthode sur le serveur. Cette méthode entraîne une exception. Axis transforme cette exception en quelque chose qui peut être envoyé au client pour indiquer l'erreur. Toutes les exceptions, pour autant que je sache, sont enveloppées dans un objet AxisFault qui est ensuite transmis au client sous la forme, je crois, d'un message SoapFault avec comme description le message d'exception. En d'autres termes, le client doit uniquement voir AxisFaults comme exception (la classe d'exception) n'est pas sérialisée et envoyée. Les exceptions de serveur doivent devenir AxisFaults côté client.

+0

Dans le Serverside code généré, il Générez un AxisFault et ajouter au contexte SOAP une org.apache.axis2.Constants.FAULT_NAME pour mapper l'erreur personnalisée dans le WSDL ... – Vinze

+0

Dans le talon du client, le problème semble être que org.apache.axiom.om.OMElement faultElt = f.getDetail(); renvoie null ...le stub n'est donc pas capable de mapper l'erreur d'axe à une exception java personnalisée (qui est générée à partir de WSDL) ... – Vinze

+1

ressemble à un bug pour moi. Si une méthode déclare explicitement ses exceptions, ces exceptions doivent être sérialisées et transmises en conséquence. Même le générateur de client de service Web d'axe Eclipse génère les classes d'exception dans le client. OMI –

1

Avez-vous essayé d'utiliser Axis2 avec Lady4j, il a résolu ce problème pour nous.

+0

comment lady4j peut aider ici? –

1

Si votre WSDL spécifie que votre service génère une erreur personnalisée, votre client devrait s'attendre à gérer ces erreurs ainsi que les exceptions distantes génériques lancées par l'opération Axis2. Lorsque votre talon reçoit un AxisFault du serveur, il tente de générer une exception personnalisée si celle-ci est spécifiée dans votre WSDL. Si cela échoue, il passera simplement l'AxisFault à la place.

Le bouchon tentera d'appeler f.getDetail(). Si c'est null, il ne tentera pas de construire une exception personnalisée et passera l'AxisFault. Avec Axis2 1.5, le MessageInOutReciver généré automatiquement sur le serveur ne définit pas cette valeur par défaut.

Vous pouvez régler manuellement sur le Serverside comme celui-ci (en supposant que vous avez autogénérés classes MyFaultException et myFault):

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

MyFaultException doit étendre quelle classe avoir accès à setFaultMessage? –

Questions connexes