2010-09-20 5 views
2

J'ai un service Web JAX-WS avec une méthode Web qui peut lancer une exception.exceptions personnalisées Throwing dans JAX-WS

@WebMethod 
public Folder getTree() throws UnauthorizedException { 
    //... 
    // Get authorization data.. 
    //... 
    if (!authorized) { 
     throw new UnauthorizedException(); 
    } 
    //... 
} 

Il fonctionne bien si l'utilisateur est autorisé, mais quand l'exception est levée, il ne génère pas de message SOAP avec un défaut, il se bloque tout service Web avec

SEVERE: Unauthorized 
    ru.cos.xdoc.storage.UnauthorizedException: Unauthorized 
    at ru.cos.xdoc.storage.Storage.getTree(Storage.java:136) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    ... 

et ferme la connexion

HTTP/1.1 500 Internal Server Error 
X-Powered-By: Servlet/2.5 
Server: Sun GlassFish Enterprise Server v2.1.1 
Content-Type: text/xml;charset="utf-8" 
Transfer-Encoding: chunked 
Date: Mon, 20 Sep 2010 15:43:59 GMT 
Connection: close 

Je sens que je manque quelque chose de simple

EDIT Le problème s'est avéré survenir seulement dans le cas où une exception est levée peu de temps après le début de la méthode web. Lorsqu'un délai est introduit avant de lancer une exception, comme

try { 
    Thread.sleep(3000); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 

throw new UnauthorizedException(); 

tout fonctionne correctement.

Est-ce que quelqu'un a une idée de ce qui peut causer un tel comportement étrange?

Répondre

-1

peut-être serait plus simple de construire un message indiquant « Autorisation refusée », ou quelque chose comme ça. À mon avis, un service Web ne devrait jamais jeter une exception, il devrait toujours retourner une réponse.

+0

Le problème est que la méthode est censée retourner l'arborescence des dossiers, c'est ce qu'un client de service Web doit être attendu. Bien sûr, il y a une option pour passer un message d'erreur dans un paramètre OUT, mais je suppose que l'exception convient mieux dans ce cas. – greycat

1

Avez-vous cartographié votre exception à un défaut? Voir JAX-WS - Map Exceptions to faults

+0

Oui, j'ai essayé de le mapper à une erreur avec différents types de constructeurs et de méthodes supplémentaires. Cela n'a eu aucun effet dans mon cas. Je pense que le problème est que le conteneur ne tente même pas de créer un défaut de l'exception puisque j'ai aucun message d'erreur comme « classe ... not found » – greycat

+0

est 'UnauthorizedException' une sous-classe de' RuntimeException'? Si tel est le cas, peut-être que le servlet WS pense que votre WS a un bug. – gpeche

+0

Non, ce n'est pas le cas. Il est hérité directement d'Exception. – greycat

Questions connexes