2014-10-07 6 views
5

In meiner Anwendung habe ich ein paar RequestMappings, die nur POST zulassen. Wenn jemand eine GET-Anforderung an diesem bestimmten Pfad auslöst, erhält er eine 405-Fehlerseite, die vom Container (Tomcat) gespeist wird. Ich kann eine 405-Fehlerseite in web.xml für die Anpassung erstellen und definieren.Benutzerdefinierte Behandlung für 405 Fehler mit Spring Web MVC

Was ich will: jede Anfrage, die einen Fehler 405 ergeben würde, sollte in einer bestimmten Controller-Methode behandelt werden.

Was ich versucht habe:

  • ein Verfahren mit "method = GET" als Gegenstück für jede der genannten Abbildungen. Das funktioniert gut, aber ich muss eine tatsächliche Anforderungszuordnung und Methode für jeden Pfad erstellen, der nur POST erlaubt. Ich finde diese unnötige Duplizierung und Unordnung.
  • eine globale 'catch' -Methode (requestmapping/*): dies funktioniert nicht, da Spring die GET-Methode als falschen Aufruf des mit POST angegebenen Pfads verwendet
  • eine ExceptionHandler-annotierte Methode zur Behandlung von Ausnahmen von Klasse HttpRequestMethodNotSupportedException: Dies funktioniert nicht. Es scheint, dass Spring diese Ausnahme vollständig in ihrem Framework-Code auslöst.
  • geben Sie meine eigene 405 in web.xml an. Dies ist nicht perfekt, da ich eine benutzerdefinierte Behandlung und keine statische Fehlerseite haben möchte.

Antwort

7

Ich würde vorschlagen, einen Handler Exception Resolver zu verwenden. Sie können die DefaultHandlerExceptionResolver des Frühlings verwenden. Überschreiben Sie handleHttpRequestMethodNotSupported() Methode und geben Sie Ihre benutzerdefinierte view zurück. Dies funktioniert in allen Anwendungen.

Der Effekt liegt nahe bei dem, was Sie in Ihrer Option erwartet haben. Der Grund dafür, dass Ihre Annotated-Methode @ExceptionHandler Ihre Ausnahme nie abfängt, liegt daran, dass diese Annotated-Methoden von ExceptionHandler aufgerufen werden, nachdem eine erfolgreiche Spring-Controller-Handlerzuordnung gefunden wurde. Ihre Ausnahme wird jedoch zuvor ausgelöst.

+2

Das ist perfekt! Eine Sache, auf die andere achten müssen, ist, dass Sie, wenn Sie sich dazu entscheiden, DefaultHandlerExceptionResolver zu überschreiben, auch die Methode getOrder() überschreiben sollten, die in der Schnittstelle Ordered angegeben ist. In dieser Methode sollten Sie einen int-Wert niedriger als Integer.MAX_VALUE zurückgeben. Der Grund dafür ist, dass der niedrigste geordnete Handler den ersten Schuss bei der Ausnahme erhält. Trotzdem danke! – Zaan

4
Working Code: 

@ControllerAdvice 
public class GlobalExceptionController { 

    @ExceptionHandler(HttpRequestMethodNotSupportedException.class) 
    public ModelAndView handleError405(HttpServletRequest request, Exception e) { 
      ModelAndView mav = new ModelAndView("/405"); 
      mav.addObject("exception", e); 
      //mav.addObject("errorcode", "405"); 
      return mav; 
     } 

In Jsp page (405.jsp): 

    <div class="http-error-container"> 
     <h1>HTTP Status 405 - Request Method not Support</h1> 
     <p class="message-text">The request method does not support. <a href="<c:url value="/"/>">home page</a>.</p> 
    </div> 
Verwandte Themen