目录
@GetMapping/@PostMapping/@PutMapping/@DeleteMapping/@PatchMapping
@RestController
@RestController的作用等同于@Controller + @ResponseBody;
@Controller
在一个类上添加@Controller注解,表明了这个类是一个控制器类。但想要让这个类成为一个处理请求的处理器光有@Controller注解是不够的,他还需要在该类中添加注解@RequestMapping;
@RequestMapping注解是用来映射请求的,即指明处理器可以处理哪些URL请求,该注解既可以用在类上,也可以用在方法上;
@ResponseBody
@ResponseBody表示方法的返回值直接以指定的格式写入Http response body中,而不是解析为跳转路径;
@ResponseBody格式的转换是通过HttpMessageConverter中的方法实现的,因为它是一个接口,因此由其实现类完成转换,例如:要求方法返回的是json格式数据,而不是跳转页面,可以直接在类上标注@RestController,而不用在每个方法中标注@ResponseBody,简化了开发过程;
@ControllerAdvice
在spring 3.2中,新增了@ControllerAdvice注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute并应用到所有@RequestMapping中;
启动应用后,被@ExceptionHandler、@InitBinder、@ModelAttribute注解的方法,都会作用在被@RequestMapping注解的方法上;
Spring异常处理3种方式
异常处理方式一:@ExceptionHandler
异常处理方式二:实现HandlerExceptionResolver接口
异常处理方式三:@ControllerAdvice+@ExceptionHandler
@RequestMapping
@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径;
@GetMapping/@PostMapping/@PutMapping/@DeleteMapping/@PatchMapping
从命名约定我们可以看到每个注释都是为了处理各自的传入请求方法类型,即@GetMapping用于处理请求方法的GET类型,@ PostMapping用于处理请求方法的POST类型等;
如果我们想使用传统的@RequestMapping注释实现URL处理程序,那么它应该是这样的:
@RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
新方法可以简化为:@GetMapping("/get/{id}")
@PreAuthorize(SpringSecurity)
@PreAuthorize注解,顾名思义是进入方法前的权限验证,@PreAuthorize声明这个方法所需要的权限表达式,例如:@PreAuthorize("hasAuthority('sys:dept:delete')"),根据这个注解所需要的权限,再和当前登录的用户角色所拥有的权限对比,如果用户的角色权限集Set中有这个权限,则放行;没有,拒绝;
Spring Security中可以通过表达式控制方法权限:
@PreAuthorize:方法调用前过滤
@PostAuthorize:方法调用后过滤
@PreFilter:对集合类型的参数过滤
@PostFilter:对集合类型的返回值过滤
@ExceptionHandler
①Spring的@ExceptionHandler可以用来统一处理方法抛出的异常;
②@ExceptionHandler注解中可以添加参数,参数是某个异常类的class,代表这个方法专门处理该类异常;
③就近原则:比如当方法抛出NumberFormatException,这个异常有父类RuntimeException,RuntimeException还有父类Exception,如果我们分别定义异常处理方法,@ExceptionHandler分别使用这三个异常作为参数,那么,当代码抛出NumberFormatException时,调用的方法将是注解参数NumberFormatException.class的方法,而当代码抛出IndexOutOfBoundsException时,调用的方法将是注解参数RuntimeException的方法;
④标识了@ExceptionHandler注解的方法的返回值类型,与标识了@RequestMapping的方法返回值类型应该是是统一的,可参见@RequestMapping的说明,比如默认返回Spring的ModelAndView对象,也可以返回String,这时的String是ModelAndView的路径,而不是字符串本身;有些情况下我们会给标识了@RequestMapping的方法添加@ResponseBody,异常处理类也可以如此操作,添加@ResponseBody注解后,可以直接返回字符串;