Spring MVC, gestion de l'exception avec HandlerExceptionResolver
Je suis en train d'essayer d'utiliser HandlerExceptionResolver
pour la gestion des exceptions dans un Spring MVC projet.
Je veux gérer normal des exceptions via resolveException
ainsi que les 404 via
handleNoSuchRequestHandlingMethod
.
Selon le type de requête JSON ou texte/html l'exception, la réponse doit être retourné de façon appropriée.
resolveException
fonctionne maintenant.
Mais handleNoSuchRequestHandlingMethod
est de me donner un mal de tête. Il n'est jamais appelé!
Selon le docu de la méthode doit être appelée sur des erreurs 404
Ce que je fais mal...
C'est ce que j'ai jusqu'à présent.
public class JsonExceptionResolver implements HandlerExceptionResolver {
protected final Log logger = LogFactory.getLog(getClass());
public ModelAndView resolveException(HttpServletRequest request,
if (exception instanceof NoSuchRequestHandlingMethodException) {
return handleNoSuchRequestHandlingMethod((NoSuchRequestHandlingMethodException) exception, request, response, handler);
}
...
}
public ModelAndView handleNoSuchRequestHandlingMethod(NoSuchRequestHandlingMethodException ex,
HttpServletRequest request,
HttpServletResponse response,
Object handler){
logger.info("Handle my exception!!!");
ModelAndView mav = new ModelAndView();
boolean isJSON = request.getHeader("Accept").equals("application/json");
if(isJSON){
...
}else{
..
}
return mav;
}
}
MODIFIER avec DefaultHandlerExceptionResolver:
public class MyExceptionResolver extends DefaultHandlerExceptionResolver {
protected final Log logger = LogFactory.getLog(getClass());
@Override
protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) {
logger.warn("An Exception has occured in the application", exception);
logger.info("exception thrown " + exception.getMessage() );
if (exception instanceof NoSuchRequestHandlingMethodException) {
return handleNoSuchRequestHandlingMethod((NoSuchRequestHandlingMethodException) exception, request, response, handler);
}
...
return mav;
}
public ModelAndView handleNoSuchRequestHandlingMethod(NoSuchRequestHandlingMethodException ex,
HttpServletRequest request,
HttpServletResponse response,
Object handler){
logger.info("Handle my exception!!!");
ModelAndView mav = new ModelAndView();
boolean isJSON = request.getHeader("Accept").equals("application/json");
if(isJSON){
...
}else{
...
}
return mav;
}
}
Le code ci-dessus n'a aucun effet.
D'autres idées?
OriginalL'auteur Jeremy S. | 2011-08-29
Vous devez vous connecter pour publier un commentaire.
Selon Juergen Hoeller de Printemps, il n'est pas possible avec le
HandlerExceptionResolver
parce qu'il ne fonctionne que pour les sous-cartographie par exemplevous avez un contrôleur mappé à
/account/**
et de l'accès à une méthode de acount où aucun mappage existe comme/acount/notExists
que cela devrait fonctionner.Je vais ouvrir un JIRA amélioration billet pour cette fonctionnalité
EDIT:
JIRA billet sur ce problème
https://jira.springsource.org/browse/SPR-8837?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=72648#comment-72648
OriginalL'auteur Jeremy S.
handleNoSuchRequestHandlingMethod
n'est pas une partie de l'HandlerExceptionResolver
de l'interface, il suffit donc de déclarer une méthode de ce nom, ne fait rien. C'est une méthode protégée spécifiques àDefaultHandlerExceptionResolver
, et est appelé à partir de sonresolveException
méthode (qui est partie de l'interface):De reproduire la même fonctionnalité, vous pouvez soit sous-classe
DefaultHandlerExceptionResolver
et de remplacer les méthodes que vous avez besoin, ou vous avez besoin d'ajouter un cas dans votreresolveException
méthode qui gèreNoSuchRequestHandlingMethodException
.J'ai aussi essayé avec l'héritage de
DefaultHandlerExceptionResolver
, mais dans le cas d'une 404, ledoResolveException
n'est jamais appelé... je n'ai missunderstand vous?OriginalL'auteur skaffman