2013-05-16 4 views
11
aufgerufen

ich folgende Controller-Klasse haben@ControllerAdvice Ausnahmebehandlungsverfahren sind nicht

package com.java.rest.controllers; 
@Controller 
@RequestMapping("/api") 
public class TestController { 

@Autowired 
private VoucherService voucherService; 


@RequestMapping(value = "/redeemedVoucher", method = { RequestMethod.GET }) 
@ResponseBody 
public ResponseEntity redeemedVoucher(@RequestParam("voucherCode") String voucherCode) throws Exception { 
    if(voucherCode.equals("")){ 
     throw new MethodArgumentNotValidException(null, null); 
    } 
    Voucher voucher=voucherService.findVoucherByVoucherCode(voucherCode); 
    if(voucher!= null){ 
     HttpHeaders headers = new HttpHeaders(); 
     headers.add("Content-Type", "application/json; charset=utf-8"); 
     voucher.setStatus("redeemed"); 
     voucher.setAmount(new BigDecimal(0)); 
     voucherService.redeemedVoucher(voucher); 
     return new ResponseEntity(voucher, headers, HttpStatus.OK); 

    } 
    else{ 
     throw new ClassNotFoundException(); 
    } 
}; 

}

Und für den Umgang mit Ausnahme Ich verwende Handler Spring3.2 Rat wie folgt

package com.java.rest.controllers; 


@ControllerAdvice 
public class VMSCenteralExceptionHandler extends ResponseEntityExceptionHandler{ 

@ExceptionHandler({ 
    MethodArgumentNotValidException.class 
}) 
public ResponseEntity<String> handleValidationException(MethodArgumentNotValidException methodArgumentNotValidException) { 
    return new ResponseEntity<String>(HttpStatus.OK); 
} 

@ExceptionHandler({ClassNotFoundException.class}) 
     protected ResponseEntity<Object> handleNotFound(ClassNotFoundException ex, WebRequest request) { 
      String bodyOfResponse = "This Voucher is not found"; 
      return handleExceptionInternal(null, bodyOfResponse, 
       new HttpHeaders(), HttpStatus.NOT_FOUND , request); 
     } 

}

Ich habe XML-Bean-Definition als

0 definiert

Die Ausnahme, die vom Controller ausgelöst wird, wird nicht vom Controller Advice Handler behandelt. Ich habe stundenlang gegoogelt, konnte aber keinen Hinweis finden, warum es passiert. Ich folgte wie beschrieben http://www.baeldung.com/2013/01/31/exception-handling-for-rest-with-spring-3-2/ hier.

Wenn jemand darüber informiert, lassen Sie bitte wissen, warum Handler keine Ausnahme behandelt.

Antwort

-1

Ich denke, das Problem ist wahrscheinlich, dass Ihre Controller-Methode Exception wirft, aber Ihre @ControllerAdvice Methoden fangen bestimmte Ausnahmen. Kombinieren Sie sie entweder zu einem Handler, der Exception abfängt, oder lassen Sie Ihren Controller diese spezifischen Ausnahmen auslösen.

So sollte Ihre Controller-Methode Unterschrift sein:

public ResponseEntity redeemedVoucher(@RequestParam("voucherCode") String voucherCode) throws MethodArgumentNotValidException, ClassNotFoundException; 

ODER Ihre Controller Beratung nur eine Methode, mit der Anmerkung haben sollte:

@ExceptionHandler({ 
    Exception.class 
}) 
11

ich die Lösung für das obige Problem gefunden. Eigentlich @ControllerAdvice benötigt MVC Namespace-Deklaration in XML-Datei. Oder wir können @EnableWebMvc mit @ControllerAdvice Annotation verwenden.

+3

Um Klarheit dieser Antwort muss die Unterklasse von ResponseEntityExceptionHandler auf dem Weg des @ComponentScan aufgenommen werden, um für den Frühling Behälter, den ihn zu erkennen. Ich denke nicht, dass die Dokumentation diesbezüglich sehr klar ist. Hoffe das spart einige Leute einige Zeit. – cwu9T9

+1

Können Sie bitte klarstellen, was Sie unter "MVC-Namespace-Deklaration" verstehen? –

+1

@EricB. Mit der MVC-Namespace-Deklaration meine ich, sollten wir in unserer Konfigurations-XML-Datei haben (zB applicationConfig.xml). Wenn wir in der XML-Datei nicht verwenden, müssen wir EnableWebMvc mit der Annotation ControllerAdvice verwenden. –

0
public class VMSCenteralExceptionHandler implements HandlerExceptionResolver { 
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { 
    } 
} 

und fügen Sie Ihre Bohnen in Ihr config.xml

<bean class="com.java.rest.controllers.VMSCenteralExceptionHandler " /> 
0

Sie müssen nur diese 2 Schritte ausführen:

  1. hinzufügen @ControllerAdvice oben auf der globalen Ausnahmebehandler Klasse.
  2. Fügen Sie Ihre Paketnamen von Ausnahmeklasse in der Komponente-Scan heißt

    <context:component-scan base-package="com.hr.controller,com.hr.exceptions" />

1

ich ähnliches Problem hatte.

Managed es im Jahr 2017 September zu beheben

Mein Fall war, dass der Exception-Handler in seinem eigenen com.example.Exceptions Paket war, und das Problem war es nicht bis zum Frühjahr ComponentScan gescannt wurde.

Lösung ist es in der ComponentScan wie so hinzuzufügen:

@ComponentScan({ "x.y.z.services", "x.y.z.controllers", "x.y.z.exceptions" }) 
+0

Und wenn es eine Spring-Boot-Anwendung ist, können Sie @SpringBootApplication verwenden (scanBasePackages = {"x.y.z.services", "x.y.z.controllers", "x.y.z.exceptions"}) –

Verwandte Themen