注解简介
在今天的每日一注解中,我们将探讨@ControllerAdvice
注解。@ControllerAdvice
是Spring框架中的一个注解,用于集中处理应用程序中所有控制器的全局异常处理、数据绑定和数据预处理。
注解定义
@ControllerAdvice
注解用于定义一个全局的异常处理、数据绑定或数据预处理的类。该类中的方法可以应用于应用程序中所有控制器的处理流程。以下是一个基本的示例:
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.http.HttpStatus;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(IllegalArgumentException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleIllegalArgumentException(IllegalArgumentException e) {
return "Illegal argument: " + e.getMessage();
}
}
在这个示例中,GlobalExceptionHandler
类使用了@ControllerAdvice
注解,该类中的方法将处理所有控制器中抛出的IllegalArgumentException
异常,并返回400状态码和错误消息。
注解详解
@ControllerAdvice
注解可以用来集中处理控制器中的常见任务,如异常处理、数据绑定和数据预处理。它可以在应用程序中跨多个控制器实现代码的复用和统一管理。
- basePackages: 指定应用
@ControllerAdvice
的基础包。 - annotations: 指定应用
@ControllerAdvice
的注解类型。
使用场景
@ControllerAdvice
广泛用于Spring MVC应用程序中,用于集中管理和处理控制器中的常见任务,如异常处理、全局数据绑定、数据预处理等。
示例代码
以下是一个使用@ControllerAdvice
注解的代码示例,展示了如何全局处理多个异常类型和数据预处理:
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.http.HttpStatus;
@ControllerAdvice
public class GlobalControllerAdvice {
@ExceptionHandler(NumberFormatException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleNumberFormatException(NumberFormatException e) {
return "Invalid number format: " + e.getMessage();
}
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public String handleException(Exception e) {
return "An unexpected error occurred: " + e.getMessage();
}
@InitBinder
public void initBinder(WebDataBinder binder) {
// 自定义数据绑定配置
}
@ModelAttribute
public void addAttributes(Model model) {
model.addAttribute("globalAttribute", "This is a global attribute");
}
}
在这个示例中,GlobalControllerAdvice
类处理了多个异常类型,并定义了数据绑定和全局模型属性的配置。
常见问题
问题:如何限制@ControllerAdvice
的作用范围?
解决方案:可以使用basePackages
或annotations
属性来限制@ControllerAdvice
的作用范围,只应用于指定包或注解的控制器。
@ControllerAdvice(basePackages = "com.example.controllers")
public class SpecificControllerAdvice {
@ExceptionHandler(SpecificException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleSpecificException(SpecificException e) {
return "Specific error: " + e.getMessage();
}
}
问题:如何全局处理验证错误?
解决方案:可以在@ControllerAdvice
中定义一个方法来处理MethodArgumentNotValidException
异常,该异常由Spring在请求参数验证失败时抛出。
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Map<String, String> handleValidationExceptions(MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getFieldErrors().forEach(error ->
errors.put(error.getField(), error.getDefaultMessage()));
return errors;
}
小结
通过今天的学习,我们了解了@ControllerAdvice
的基本用法和应用场景。明天我们将探讨另一个重要的Spring注解——@Async
。
相关链接
- Spring 官方文档
- Spring MVC 注解驱动的控制器
- Exception Handling in Spring MVC
希望这个示例能帮助你更好地理解和应用@ControllerAdvice
注解。如果有任何问题或需要进一步的帮助,请随时告诉我。