Spring常用注解详解(二)
1、@ExceptionHandler:
此注解是 Spring Framework 中用于处理异常的注解。它可以用在方法上,用于指定特定异常类的处理方法。当控制器中抛出指定类型的异常时,Spring 将调用对应的 @ExceptionHandler 注解标注的方法来处理异常。
基本用法:
@Controller
@RequestMapping("/example")
public class ExampleController {
@GetMapping("/error")
public String throwError() {
// 抛出异常,触发异常处理方法
throw new CustomException("This is a custom exception.");
}
@ExceptionHandler(CustomException.class)
public ModelAndView handleCustomException(CustomException ex) {
// 处理 CustomException 异常
ModelAndView modelAndView = new ModelAndView("error");
modelAndView.addObject("errorMessage", ex.getMessage());
return modelAndView;
}
}
在上述例子中,@ExceptionHandler 注解被用于标注 handleCustomException 方法,表示该方法用于处理 CustomException 异常。当 throwError 方法中抛出 CustomException 异常时,Spring 将调用 handleCustomException 方法来处理异常,并返回一个包含错误信息的视图。
多个异常的处理:
@ExceptionHandler({CustomException1.class, CustomException2.class})
public ModelAndView handleMultipleExceptions(Exception ex) {
// 处理多个异常
ModelAndView modelAndView = new ModelAndView("error");
modelAndView.addObject("errorMessage", ex.getMessage());
return modelAndView;
}
可以同时处理多个异常类型,通过在 @ExceptionHandler 注解中指定多个异常类。
全局异常处理:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ModelAndView handleException(Exception ex) {
// 处理全局异常
ModelAndView modelAndView = new ModelAndView("error");
modelAndView.addObject("errorMessage", "An error occurred: " + ex.getMessage());
return modelAndView;
}
}
@ControllerAdvice 注解可以用于全局异常处理,所有控制器中未捕获的异常都会被 handleException 方法处理。
注意事项:
@ExceptionHandler 注解可以在控制器类中的任何方法上使用,用于处理该方法中抛出的指定异常类型的异常。
异常处理方法可以返回不同类型的结果,例如 ModelAndView、ResponseEntity 等,根据需求选择合适的返回类型。
在全局异常处理类中使用 @ControllerAdvice 注解,可以处理整个应用中的异常,提供全局一致的异常处理策略。
使用 @ExceptionHandler 注解可以使得异常处理更加集中和灵活,可以根据具体的业务需求为不同类型的异常定制不同的处理逻辑。
2、@ModelAttribute:
此注解是 Spring Framework 中用于将方法的返回值或方法参数绑定到模型(Model)中的注解。它可以用在方法的参数上或方法的返回值上,用于在视图中访问或修改模型数据。
在方法参数上使用 @ModelAttribute:
@Controller
@RequestMapping("/example")
public class ExampleController {
@GetMapping("/user")
public String getUser(@ModelAttribute("user") User user) {
// 使用@ModelAttribute注解将"user"放入模型中,供视图使用
// 如果模型中不存在名为"user"的属性,将创建一个新的User对象并放入模型中
return "userDetails";
}
}
在上述例子中,@ModelAttribute(“user”) 注解被用于标注 getUser 方法的参数,表示将模型中名为 “user” 的属性绑定到方法参数 User user 上。如果模型中不存在名为 “user” 的属性,Spring 将创建一个新的 User 对象并放入模型中,以供视图使用。
在方法返回值上使用 @ModelAttribute:
@Controller
@RequestMapping("/example")
public class ExampleController {
@ModelAttribute("currentUser")
public User getCurrentUser() {
// 返回一个User对象,将其放入模型中,属性名为"currentUser"
return new User("John", "Doe");
}
@GetMapping("/profile")
public String userProfile() {
// 在视图中可以通过${currentUser}获取到User对象
return "profile";
}
}
在上述例子中,@ModelAttribute(“currentUser”) 注解被用于标注 getCurrentUser 方法的返回值,表示将方法返回的 User 对象放入模型中,属性名为 “currentUser”。在视图中,可以通过 ${currentUser} 获取到该对象。
注意事项:
@ModelAttribute 注解可以用在方法的参数上,表示将模型中的属性绑定到方法参数上,也可以用在方法的返回值上,表示将方法返回的对象放入模型中。
如果在方法参数上使用 @ModelAttribute,Spring 会尝试从模型中查找对应属性的值,如果找到则绑定,如果没有找到则创建一个新的对象,并将其放入模型中。
如果在方法的返回值上使用 @ModelAttribute,Spring 将该对象放入模型中,并使用指定的属性名(或默认的属性名)。
@ModelAttribute 注解还可以用在方法上,标识在控制器的每个请求处理方法之前执行的方法。这样的方法可以用于初始化一些模型数据。
@Controller
@RequestMapping("/example")
public class ExampleController {
@ModelAttribute
public void addCommonAttributes(Model model) {
model.addAttribute("commonAttribute", "This is a common attribute");
}
@GetMapping("/page1")
public String page1() {
return "page1";
}
@GetMapping("/page2")
public String page2() {
return "page2";
}
}
在上述例子中,addCommonAttributes 方法被标注了 @ModelAttribute,它将在每个请求处理方法之前执行,为模型添加一个名为 “commonAttribute” 的属性。
3、@SessionAttributes:
此注解是 Spring Framework 中用于将模型的特定属性保留在 HTTP 会话中的注解。它可以用在类级别或方法级别上,用于指定哪些模型属性应该存储在会话中,以便它们可以在多个请求之间共享。
在类级别上使用 @SessionAttributes:
@Controller
@RequestMapping("/example")
@SessionAttributes("user")
public class ExampleController {
@ModelAttribute("user")
public User getDefaultUser() {
// 默认的User对象,会被放入模型,并保留在会话中
return new User("Guest", "User");
}
@GetMapping("/home")
public String home(@ModelAttribute("user") User user) {
// 访问路径:/example/home
// 在视图中可以通过${user}获取到User对象
return "home";
}
}
在上述例子中,@SessionAttributes(“user”) 注解被用于标注 ExampleController 类,表示 User 对象名为 “user” 的属性将会被存储在会话中。getDefaultUser 方法用于提供一个默认的 User 对象,并将其放入模型中。
在方法级别上使用 @SessionAttributes:
@Controller
@RequestMapping("/example")
public class ExampleController {
@ModelAttribute("user")
public User getDefaultUser() {
// 默认的User对象,会被放入模型
return new User("Guest", "User");
}
@GetMapping("/login")
public String login() {
// 访问路径:/example/login
// 在视图中可以通过${user}获取到User对象
return "login";
}
@GetMapping("/logout")
public String logout(SessionStatus sessionStatus) {
// 访问路径:/example/logout
// 清除会话中的"user"属性
sessionStatus.setComplete();
return "logout";
}
}
在上述例子中,@ModelAttribute(“user”) 注解被用于标注 getDefaultUser 方法,表示 User 对象名为 “user” 的属性将会被存储在会话中。login 方法用于处理登录页面的请求,而 logout 方法用于处理注销页面的请求,并通过 SessionStatus 清除会话中的 “user” 属性。
注意事项:
@SessionAttributes 注解可以用在类级别或方法级别上。
在类级别上使用时,指定的模型属性将被存储在整个会话中,而不仅仅是在单个请求中。
在方法级别上使用时,指定的模型属性将只在当前请求和处理该请求的会话之间共享。可以使用 SessionStatus 的 setComplete() 方法来清除会话中的属性。
当使用 @SessionAttributes 时,需要确保相应的会话管理器已经配置,以便正确管理会话的创建和销毁。
尽量避免将敏感信息放入会话,因为会话可能在多个请求之间共享。
4、@InitBinder:
此注解是 Spring MVC 中的一个注解,用于在控制器中自定义数据绑定初始化逻辑。它可以用在方法上,标识一个方法为初始化绑定器的方法,用于自定义数据绑定的规则。
基本用法:
@Controller
@RequestMapping("/example")
public class ExampleController {
@InitBinder
public void initBinder(WebDataBinder binder) {
// 在此方法中可以添加自定义的数据绑定规则
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
CustomDateEditor editor = new CustomDateEditor(dateFormat, true);
binder.registerCustomEditor(Date.class, editor);
}
@GetMapping("/date")
public String getDate(@RequestParam Date date) {
// 处理日期参数
return "date";
}
}
在上述例子中,@InitBinder 注解被用于标注 initBinder 方法,该方法接收一个 WebDataBinder 参数,通过该参数可以注册自定义的数据编辑器,如上例中的日期编辑器。
多个编辑器的情况:
@Controller
@RequestMapping("/example")
public class ExampleController {
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
CustomDateEditor dateEditor = new CustomDateEditor(dateFormat, true);
binder.registerCustomEditor(Date.class, dateEditor);
NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.US);
binder.registerCustomEditor(Integer.class, new CustomNumberEditor(Integer.class, numberFormat, true));
}
@GetMapping("/data")
public String getData(@RequestParam Date date, @RequestParam Integer count) {
// 处理日期和数字参数
return "data";
}
}
在上述例子中,initBinder 方法注册了两个自定义编辑器,一个用于处理日期类型,另一个用于处理整数类型。
注意事项:
@InitBinder 注解可以用在控制器类的方法上,用于指定初始化数据绑定器的方法。
初始化绑定器的方法必须接收一个 WebDataBinder 参数。
在初始化绑定器的方法中,可以使用 binder.registerCustomEditor() 注册自定义的数据编辑器,以适应不同类型的数据绑定需求。
自定义数据编辑器可以用于将字符串转换为特定类型的对象,以及将对象转换为字符串。
除了 @InitBinder 注解,还可以使用 @ModelAttribute 注解来实现对模型属性的全局初始化。
5、@EnableWebMvc:
此注解是 Spring MVC 中的一个注解,它用于启用 Spring MVC 框架的基本功能。通常,当你使用 Spring MVC 架构开发 Web 应用时,需要在配置类上使用 @EnableWebMvc 注解,以启用 Spring MVC。
在经典的 Spring 应用中,@EnableWebMvc 可以用于替代 XML 配置中的 mvc:annotation-driven,它启用了一系列默认配置,包括处理器映射、处理器适配器、视图解析器等,使得开发者能够更方便地使用 Spring MVC。
基本用法:
@Configuration
@EnableWebMvc
@ComponentScan("com.example.web")
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
// 可以添加其他自定义配置
}
在上述例子中,@EnableWebMvc 注解被用于标注 WebConfig 配置类,同时实现了 WebMvcConfigurer 接口,以便在配置类中进行更多的自定义配置。
注意事项:
@EnableWebMvc 注解通常与实现了 WebMvcConfigurer 接口的配置类一起使用,以提供更多的配置选项。
该注解启用了一些默认配置,包括默认的 HandlerMapping、HandlerAdapter、ViewResolver 等。
使用 @EnableWebMvc 时,可以覆盖默认配置,例如通过实现 WebMvcConfigurer 接口来添加拦截器、资源处理器、自定义视图解析器等。
@EnableWebMvc 不是必需的,如果你希望完全自定义 Spring MVC 的配置,你可以选择不使用这个注解。但通常情况下,它会减少一些繁琐的配置工作,使得开发更加便捷。
在 Spring Boot 应用中,通常不需要显式使用 @EnableWebMvc,因为 Spring Boot 已经自动配置了 Spring MVC。如果你需要自定义配置,可以直接在 application.properties 或 application.yml 文件中进行配置。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!