2010-07-12 29 views
28

için ExceptionHandler oluşturun, ben istekleri "(404) bulunamadı sayfa" idare edecek ExceptionHandler ek açıklama kullanarak bir istisna işleyicisi oluşturmak ister. Bunu yapmak için aşağıdaki kodu kullanıyorum. Ancak, var olmayan bir URL'ye işaret ettiğimde, Spring tarafından tanımlanan varsayılan istisna eylemcisi çalıştırılıyor.Bahar 3 - Bahar 3 Kullanılması NoSuchRequestHandlingMethodException

NoSuchRequestHandlingMethodException istisnasını ele alıyorum olabilir. Eğer öyleyse, hangi istisna kayıt olmalıyım?

Aşağıdaki koda bakıp ne yaptığımı görmek ister misiniz?

NOT: Ben @ExceptionHandleriçin NullPointerException yılında istisna değiştirip null işaretçi atmak için bir RequestMapping oluşturursanız o çalışacaktır. aynı sınıfın bir @RequestMapping yöntem, bir özel durum zaman

import org.springframework.stereotype.Controller; 
    import org.springframework.web.bind.annotation.ExceptionHandler; 
    import org.springframework.web.bind.annotation.RequestMapping; 

    import org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException; 

    import org.apache.commons.logging.Log; 
    import org.apache.commons.logging.LogFactory; 
    import org.springframework.web.servlet.ModelAndView; 

    @Controller 
    public class GeneralHandler { 
     private final Log logger = LogFactory.getLog(getClass()); 

     @ExceptionHandler(NoSuchRequestHandlingMethodException.class) 
     public ModelAndView handleException (NoSuchRequestHandlingMethodException ex) { 
     ModelAndView mav = new ModelAndView(); 
     logger.error("Exception found: " + ex); 
     return mav; 
     } 
    } 

cevap

41

@ExceptionHandler -annotated yöntemler çağrılır. Bu nedenle, eşleştirilen yöntem ve istisna eylemcisi aynı sınıfta bir araya geldiğinden, bu, NullPointerException'u çalıştıran eşleştirmeyi eklediğinizde işe yaradı. o bildiğim kadarıyla bir işleyici yöntemine isteği eşleşen olarak alamadım çünkü hiçbir eşleme bulunursa

, Bahar, senin @ExceptionHandler ile NoSuchRequestHandlingMethodException ilişkilendirerek bir yol yok. Bu, dokümanlar içinde açıkça belirtilmemiş, ancak gözlemlediğim davranış.

Bu özel durumu özel olarak ele almak isterseniz, daha özel olan @ExceptionHandler tekniğinden ziyade, daha genel olan HandlerExceptionResolver approach'u kullanmanız gerekecektir.

+2

teşekkür ederiz JSON dönmek için daha fazla ek açıklamalar ekleyebilir. HandlerExceptionResolver yaklaşımını kullanacağım. – sgsweb

+0

sizin için işe yaraydı mı? Ben hala aynı sorunu yaşıyorum – SJS

2

this yaklaşımı ile gidebilir, bu harika bir fikir ve işe yarar, yalnızca özel Handler make @ExceptionHandler'ın göründüğü kadar yararlı olmayan istisnalar atması gerekliliği.

16

Bahar 3.2 olarak böyle tüm Kontrolörleri için bir ExceptionHandler olması @ContollerAdvice kullanabilirsiniz:

@ControllerAdvice 
public class GeneralHandler { 

    @ExceptionHandler 
    public ModelAndView handleException (NoSuchRequestHandlingMethodException ex) { 
     ModelAndView mav = new ModelAndView(); 
     ... 
     return mav; 
    } 
} 

Hatta

@ExceptionHandler 
    @ResponseBody 
    @ResponseStatus(HttpStatus.BAD_REQUEST) 
    public RestError resolveBindingException (MethodArgumentNotValidException methodArgumentNotValidException, Locale locale) 
    { 
     BindingResult bindingResult = methodArgumentNotValidException.getBindingResult(); 
     return getRestError(bindingResult, locale); 
    } 
+0

Bu ne yapmak bitti, ama yine de bir ContentNegotiatingViewResolver kullanıyordum, ben 'Exception' yakalamak bitti, daha sonra JSON ve XML serileştirme ek açıklamaları ile bir sınıfta sarma ve bu dönen ModelAndView yerine istemci, sarıcı nesnesinin serileştirilmiş sürümünü almayı sona erdirir. –