2010-09-03 27 views
1

J'ai un service Web Axis2 qui envoie différents messages de détail dans la réponse de panne pour signaler des problèmes dans l'appel. À un certain point, en raison d'erreurs de serveur (autres que celles traitées par le service Web), dans la chaîne de détails de défaut, j'obtiens la pile complète de ce qui s'est passé. Je ne veux pas que le client voie la trace de la pile, donc (en tant que capture toutes les erreurs) je veux sortir un message simple "Erreur de serveur" sans stacktrace, pas de rien.Comment exclure stacktrace de la réponse à une erreur axis2

Quelle est la manière la plus simple d'intercepter les réponses aux pannes et de changer le message d'erreur? Les modules sont-ils la seule façon de (compliquer) faire cela?

Ou, y a-t-il une configuration dans Axis2 qui indique de ne pas afficher la trace de pile en erreur?

Merci!

Répondre

-1

Pouvez-vous pas seulement attraper le AxisFault

try { 
    // do stuff 
} catch (AxisFault f) { 
    log.error("Encountered error doing stuff", f); 
    throw new IOException("Server error"); 
} 
+0

Où vais-je placer ce code? L'erreur se propage à partir de la classe MessageReceiverInOut générée où j'ai ce code tout attraper: ** ...} catch (java.lang.Exception e) {throw org.apache.axis2.AxisFault.makeFault (e); ... ** – userOfAxis2

+0

Vous devez utiliser la classe 'MessageReceiverInOut' quelque part? –

+0

org.apache.axis2.receivers.AbstractInOutSyncMessageReceiver l'utilise. La classe * MessageReceiverInOut est générée automatiquement par l'outil codegen de mon fichier wsdl. Il semble fragile de le pirater et d'y ajouter mes choses. – userOfAxis2

1

J'ai déjà eu un problème similaire. Je ne sais pas s'il y a une config pour désactiver l'affichage de la pile, au moins aucun que j'ai pu trouver à ce moment-là (cela aurait été la meilleure solution). Au lieu de cela, j'ai opté pour une approche rapide et sale, principalement en raison du manque de temps.

Ce que j'ai fait était de fournir moi-même à Axis2 le détail du défaut. La servlet Axis2 a une méthode appelée handleFault qui traite de la génération du défaut. Plus exactement (plus loin dans l'appel), la méthode MessageContextBuilder.createFaultEnvelope est utilisée pour construire l'élément fault. La présence de la pile dans le détail est le comportement par défaut, mais il existe des moyens de spécifier vos détails personnalisés. Une façon consiste à utiliser le champ detail dans lequel vous pouvez ajouter un OMElement (voir AXIOM) pour être placé dans la panne. Donc, vous faites quelque chose comme:

public class MyServlet extends AxisServlet { 
    ... 
    public void handleFault(MessageContext msgContext, OutputStream out, AxisFault e) { 
    OMFactory factory = OMAbstractFactory.getOMFactory(); 
    OMElement detail = factory.createElement(...); 
    e.setDetail(detail); 
    // now let axis do its thing with the new improved AxisFault 
    super.handleFault(msgContext, out, e); 
    } 
} 

Maintenant, à la place de l'exception stacktrace, votre détail sera ajouté à la place.

0

Axis2 utilise l'enregistrement des communes Apache et les messages AxisFault que vous voyez sont générés par le code dans Axis2 qui ressemble à:

try { 
    executeMethod(httpClient, msgContext, url, getMethod); 
    handleResponse(msgContext, getMethod); 
} catch (IOException e) { 
    log.info("Unable to sendViaGet to url[" + url + "]", e); 
    throw AxisFault.makeFault(e); 
} finally { 
    cleanup(msgContext, getMethod); 
} 

[Ce segment de code provient de org.apache. axis2.transport.http.HTTPSender]

Référez-vous donc à apache commons logging user guide pour savoir comment définir les niveaux de consignation et la destination des messages.

Espérons que cela aide.