@ControllerAdvice annotation improvements in Spring 4

@ControllerAdvice annotation improvements in Spring 4

@ControllerAdvice is introduced from the Spring 3.2 release. In this version 3.2 It is special type of @Component to declare the global exceptions handler. When you create a class with @ControllerAdvice and then write few methods with the @ExceptionHandler annotations, any exception thrown in the application will be handled by this class. It is acting as the global exception handler. However, you can not restrict this handling to any specific type of controller or classes.

Among many new features in Spring 4 I found @ControllerAdvice improvements. @ControllerAdvice is a specialization of a @Component that is used to define @ExceptionHandler, @InitBinder, and @ModelAttribute methods that apply to all @RequestMapping methods. Prior to Spring 4, @ControllerAdvice assisted all controllers in the same Dispatcher Servlet. With Spring 4 it has changed. As of Spring 4 @ControllerAdvice may be configured to support defined subset of controllers, whereas the default behavior can be still utilized.

By using @ControllerAdvice annotation in spring 4.0 you can narrow the scope of the exception handler. For example, you can declare a exception handler which will handle only the exception thrown by the @RestController , a special type of controller introduced in the Spring 4.0.

@ControllerAdvice assisting all controllers
Let's assume we want to create an error handler that will print application errors to the user. Let's assume this is a basic Spring MVC application with jsp as a view engine and we have an ArticleController with the following @RequestMapping method:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
 
@Controller
@RequestMapping("article")
class ArticleController {
 
    @RequestMapping("{articleId}")
    @ResponseBody
    String getArticle(@PathVariable Long articleId) {
        throw new IllegalArgumentException("Getting article problem.");
    }
}

Create RestConroller
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
 
@RestConroller
@RequestMapping("article")
class ArticleController {
 
    @RequestMapping("{articleId}")
    String getArticle(@PathVariable Long articleId) {
        throw new IllegalArgumentException("Getting article problem.");
    }
}

@ControllerAdvice for RestController

If you look at the below code, this exception handler called only when the exception is thrown from the RestController.
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
 
@ControllerAdvice(annotations=RestController.class)
@RequestMapping("article")
class ArticleController {
    @ExceptionHandler(Exception.class)
    @RequestMapping("{articleId}")
    String getArticle(@PathVariable Long articleId) {
        throw new IllegalArgumentException("Getting article problem.");
    }
}


<<Previous <<   || Index ||   >>Next >>



No comments:

Post a Comment