2010-10-27 12 views
2

J'ai un code qui jette un type spécifique d'exception comme celui-ci:Ajouter un message d'exception à la réponse JSON

throw new BadDataException("error message"); 

ce genre d'exceptions sont jetés à l'intérieur d'une méthode dont le type de réponse est JSON. J'ai une configuration de ce type d'exception comme celui-ci:

<global-exception-mappings> 
    <exception-mapping result="badDataError" exception="mypackage.BadDataException" /> 
</global-exception-mappings> 

<result name="badDataError" type="json"> 
    <param name="statusCode">500</param> 
</result> 

Je voudrais ajouter le message d'exception à la réponse JSON pour montrer à l'utilisateur. Est-il possible de mapper le message d'exception à la réponse lorsqu'un code d'état 500 est renvoyé. L'appel ajax serait quelque chose comme ceci:

$.ajax(
{ 
    ... 
    success: function(data, textStatus) { 
     alert('Success'); 
    }, 
    error: function (XMLHttpRequest, textStatus, errorThrown) { 
     alert("Error");//I'd like to add here the reason (exception message) 
    } 
    ... 
} 
); 

Comment puis-je ajouter automatiquement le message de cette exception à la HTTP 500 réponse? (S'il est possible)

Merci

+0

Juste pour clarifier, votre question est comment envoyer le message d'erreur avec la réponse HTTP 500? Ou comment le recevoir du côté client? Ou les deux? –

+0

@ T.J. Crowder Ma question concerne la façon de prendre le message de l'exception et de l'ajouter à la réponse HTTP 500 avec cette configuration. – Javi

Répondre

3

C'est enfin comment je l'ai fait. J'ai ajouté un champ errorMessage à la réponse HTTP 500 de cette manière.

<result name="badDataError" type="httpheader"> 
       <param name="status">500</param> 
       <param name="headers.errorMessage">${exception.message}</param> 
</result> 

et dans la requête ajax je récupère le message comme ceci. Peut-être qu'il y a une manière plus élégante de faire ceci, mais au moins cela fonctionne.

1

Une autre option consiste à créer un type de résultat personnalisé qui définit tous les deux un état 500 ISE. et renvoie une réponse JSON contenant les données d'erreur. Ensuite, il suffit de mapper votre exception à ce type de résultat dans votre fichier struts.xml (tout comme vous l'avez mappé au type httpscript dans votre exemple ci-dessus). Une autre option consiste à créer une annotation pour vos méthodes d'action Struts que vous avez l'intention d'invoquer via AJAX. Ensuite, sous-classe ExceptionMappingInterceptor standard et si la méthode d'action est annotée comme @AjaxRequest (ou peu importe comment vous l'appelez), vous renvoyez une réponse JSON standard qui contient les informations d'exception. Sinon, vous passez au comportement par défaut de mappage du résultat à une sorte de page ou de résultat. Personnellement, je préfère cette dernière approche.