Java >> Java tutorial >  >> Tag >> Spring

Controllerråd – Undtagelseshåndtering i fjederstøvle

I dette indlæg vil jeg vise, hvordan vi kan bruge annotationen @ControllerAdvice – Controller Advice – en undtagelseshandler i Spring Boot-applikationen. Hvis du vil læse, hvordan du håndterer ufangede undtagelser i Spring Boot, kan du tjekke mit gamle indlæg.

Hvad er @ControllerAdvice ?

Forår 3.2 introducerede en annotation @ControllerAdvice . Annoteringen tillader håndtering af undtagelser på tværs af applikationen. Før dette tilbød Spring endnu en annotation @ExceptionHandler til undtagelseshåndtering. Men du skal tilføje denne annotation i hver controller-klasse i din applikation. Det hjælper ikke på applikationsniveau.

@ControllerAdvice er en annotationsdrevet interceptor. Den opsnapper de fleste af de klasser, der inkluderer @RequestMapping .

Sammenligning med @ExceptionHandler

I de fleste controllerklasser kan du tilføje @ExceptionHandler annotation til at håndtere undtagelser for den pågældende klasse. Ikke desto mindre kan man i sådanne klasser tilføje en ekstra metode til at håndtere undtagelser fra @RequestMapping metoder i samme controller. Disse undtagelseshåndteringsmetoder kan omdirigere brugeren til fejlsiden ELLER opbygge et tilpasset fejlsvar.

Dette vil se ud som nedenfor:

@RestController
@RequestMapping("/companies")
public class CompanyController
{
  
  @GetMapping
  public List<Company> getAllCompanies(HttpServletRequest req) throws Exception {
    
  } 
  @ExceptionHandler(Exception.class)
  public ModelAndView handleError(HttpServletRequest req, Exception ex) {
    logger.error("Request: " + req.getRequestURL() + " raised " + ex);

    ModelAndView mav = new ModelAndView();
    mav.addObject("exception", ex);
    mav.addObject("url", req.getRequestURL());
    mav.setViewName("error");
    return mav;
  }

}

Derudover kan du se metoden getAllCompanies smide en undtagelse. Metoden handleError vil håndtere undtagelsen fra getAllCompanies .

Desuden, hvis jeg har en anden controller som UserController , jeg ender med at skrive som nedenfor, hvis den skal håndtere undtagelser.

@RestController
@RequestMapping("/users")
public class UserController
{
  
  @GetMapping
  public List<User> getAllUsers(HttpServletRequest req) throws Exception {
    
  } 
  @ExceptionHandler(Exception.class)
  public ModelAndView handleError(HttpServletRequest req, Exception ex) {
    logger.error("Request: " + req.getRequestURL() + " raised " + ex);

    ModelAndView mav = new ModelAndView();
    mav.addObject("exception", ex);
    mav.addObject("url", req.getRequestURL());
    mav.setViewName("error");
    return mav;
  }

}

Fremover, dette gør en masse duplikatkode. Det er her Controller Advice kommer ind i billedet med en fordel.

Eksempel på controllerrådgivning

En Controller Advice giver dig mulighed for at bruge den samme undtagelseshåndteringsteknik på tværs af applikationer uden at gentage nogen kode.

Som følge heraf er en klasse kommenteret med @ControllerAdvice implementerer tre typer metoder:

  • Undtagelseshåndteringsmetode annoteret med @ExceptionHandler
  • Modelforbedringsmetoder annoteret med @ModelAttribute
  • Initialiseringsmetoder for bindemiddel annoteret med @InitBinder


@ControllerAdvice
public class GlobalExceptionHandler
{
   
    @ExceptionHandler(CompanyNotFoundException.class)
    public ModelAndView handleError(HttpServletRequest req, CompanyNotFoundException ex) 
    {
       logger.error("Request: " + req.getRequestURL() + " raised " + ex);

       ModelAndView mav = new ModelAndView();
       mav.addObject("exception", ex);
       mav.addObject("url", req.getRequestURL());
       mav.setViewName("error");
       return mav;
     }

    @ExceptionHandler(UserNotFoundException.class)
    public ResponseEntity handleUserExceptionError(HttpServletRequest req, HttpServletResponse res, UserNotFoundException ex)
    {
       List errors = Collections.singletonList(ex.getMessage());
       // Get headers
       if(HttpStatus.INTERNAL_SERVER_ERROR.equals(res.getStatus()))
       {
         // do something
       } 

       return new ResponseEntity<>(new ApiError(errors), headers, status);
    }

}

Dette vil nu gøre det muligt at opsnappe enhver undtagelse, der er smidt fra controllere. Dette gør det nemmere at implementere undtagelseshåndtering.

Konklusion

I dette indlæg viste jeg, hvordan vi kan implementere Controller Advice – exception handler i Spring Boot. Dette er en meget effektiv måde at håndtere undtagelser i de nuværende applikationer bygget med Spring Boot.


Java tag