1. @ControllerAdvice
- 和@ExceptionHandler,@InitBinder,@ModelAttribute配合使用来处理相应的流程;
- 如果被标注的类实现了ResponseBodyAdvice接口,则可以拦截@ResponseBody处理流程,自定义处理返回值
- 如果被标注的类实现了RequestBodyAdvice接口,则可以拦截@RequestBody处理流程,自定义处理请求参数
属性说明
属性名 | 说明 |
---|---|
basePackages | 只有在指定包下的Controller才能被拦截,为空则不限制 |
assignableTypes | 只有继承了指定Class的Controller才能被拦截,为空则不限制 |
annotations | 只有标注了指定注解的Controller才能被拦截,为空则不限制 |
示例
@ControllerAdvice
public class ExceptionControllerAdvice implements ResponseBodyAdvice<Response<Object>>,
RequestBodyAdvice{
//.........
}
2. @ExceptionHandler
- 直接用在Controller 中用于异常处理
- 和@ControllerAdvice配合使用用于全局异常拦截,并处理
属性说明
属性名 | 说明 |
---|---|
value | 只处理指定的异常类型 |
示例
@ControllerAdvice
public class ExceptionControllerAdvice {
/**
* 处理所有不可知的异常。
*/
@ExceptionHandler(Exception.class)
public Response<Error> handleException(Exception ex) {
Throwable rootCause = ExceptionUtils.getRootCause(ex);
Throwable handleEx = rootCause != null ? rootCause : ex;
log.error(handleEx.getMessage(), handleEx);
// 2 未知错误处理
return Response.fail(handleEx);
}
}
3. @InitBinder
用于处理web请求参数绑定到bean中的流程
- 直接用在Controller 中用于参数绑定
- 和@ControllerAdvice配合使用用于全局参数绑定
示例
@ControllerAdvice
public class ExceptionControllerAdvice {
//特定格式日期绑定
@InitBinder
public void initBinder(WebDataBinder binder) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
CustomDateEditor dateEditor = new CustomDateEditor(df, true);
binder.registerCustomEditor(Date.class, dateEditor);
}
}
4. @ModelAttribute
可以修改model中的属性值,用于页面渲染
- 直接用在Controller 中
- 和@ControllerAdvice配合使用用于全局配置
- 对于前后端分离的情况没有使用价值
示例
@ControllerAdvice
public class ExceptionControllerAdvice {
//特定格式日期绑定
@ModelAttribute
public void modelAttribute(String val, Model model) {
//可以从页面上获取key
model.addAttribute("key",val);
}
}
4. @CookieValue
- 请求参数在cookie中,从cookie中获取值
属性说明
属性名 | 说明 |
---|---|
value | cookie中的key |
示例
@RestController
@RequestMapping("/spring")
public class SpringController {
@GetMapping("/testCookie")
public void testCookie(@CookieValue("key") String val) {
System.out.println(val);
}
}
4. @CrossOrigin
用于Controller如何响应跨域请求
属性说明
属性名 | 说明 |
---|---|
value | 允许访问的其他域 |
origins | 同value |
allowedHeaders | 允许的请求头 |
exposedHeaders | 跨域请求下客户端只能获取部分响应头。像自定义的响应头需在此设置,客户端才能获取到 |
methods | 允许的http 方法,如get,post |
allowCredentials | 是否允许发送cookie,证书等 |
maxAge | 预检请求的有效期时间,对于相同的预检请求,在有效期内不需要重复发送 |
示例
@RestController
@RequestMapping("/spring")
public class SpringController {
//该请求允许跨域,而且没有任何其他域名、请求头等限制
@CrossOrigin
@GetMapping("/testCrossOrigin")
public void testCrossOrigin( String val) {
System.out.println(val);
}
}
5. @MatrixVariable
获取矩阵变量的值
- 矩阵变量:类似这种请求 /info;a=2;b=1,以;相隔的变量
属性说明
属性名 | 说明 |
---|---|
value | 请求参数名 |
name | 同value |
pathVar | 路径变量值 |
示例
@RestController
@RequestMapping("/spring")
public class SpringController {
/**
/testMatrixVariabletest;key=3 结果为3
/testMatrixVariable/abc;key=3 结果为空,因为pathVar不满足
*/
@GetMapping("/testMatrixVariable/{path}")
public void testMatrixVariable(@MatrixVariable(name="key",pathVar="test") String val) {
System.out.println(val);
}
}
6. @PathVariable
获取路径变量的值
- 路径变量:类似这种请求 /a/{info},{}中为路径变量,key为info
属性说明
属性名 | 说明 |
---|---|
value | 请求参数名 |
name | 同value |
示例
@RestController
@RequestMapping("/spring")
public class SpringController {
/**
/testPathVariable/test 结果为test
*/
@GetMapping("/testPathVariable/{path}")
public void testPathVariable(@PathVariable("path") String val) {
System.out.println(val);
}
}
7. @RequestAttribute
获取reqeust属性中的值
- 主要用于在转发中传递属性
属性说明
属性名 | 说明 |
---|---|
value | 请求参数名 |
name | 同value |
示例
@RestController
@RequestMapping("/spring")
public class SpringController {
/**
设置id属性
*/
@GetMapping("/testRequestAttribute/setAttr")
public String testRequestAttributeSet(HttpServletRequest request) {
request.setAttribute("id", 001);
return "forward:/spring/testCookie/getAttr";
}
/**
获取id属性
*/
@GetMapping("/testCookie/getAttr")
public void testRequestAttributeGet(@RequestAttribute("id") String val) {
System.out.println(val);
}
}
8. @RequestPart
获取Content-Type:multipart/form-data请求方式中的数据
- multipart/form-data 是一种复合的请求方式,请求的数据可以按规则来分隔为几部分,每部分都有自己的Content-Type,该注解通过Content-Type来处理每部分的数据
属性说明
属性名 | 说明 |
---|---|
value | 请求参数名 |
name | 同value |
示例
类似如下请求,----WebKitFormBoundaryrHKCBY7qhFd3TeeD 为每部分的分隔符
POST http://localhost/spring/testCookie/part HTTP/1.1
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrHKCBY7qhFd3TeeD
------WebKitFormBoundaryrHKCBY7qhFd3TeeD
Content-Disposition: form-data; name="name"
title
------WebKitFormBoundaryrHKCBY7qhFd3TeeD
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png
PNG ... content of chrome.png ...
------WebKitFormBoundaryrHKCBY7qhFd3TeeD--
@RestController
@RequestMapping("/spring")
public class SpringController {
@PostMapping("/testRequestPart/part")
public void testRequestPart(@RequestPart("file") MultipartFile file,@RequestPart("name") String name) {
System.out.println(name);
}
}
9. @ResponseStatus
主要用设置异常响应时的状态码和描述
属性说明
属性名 | 说明 |
---|---|
value | 响应码 |
code | 同value |
reason | 响应的提示 |
示例
@RestController
@RequestMapping("/spring")
public class SpringController {
//响应码将从200 变为500
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
@GetMapping("/testResponseStatus/test")
public void testResponseStatus( String val) {
System.out.println(val);
}
}
10. @SessionAttribute
- 从session中获取值
属性说明
属性名 | 说明 |
---|---|
value | session中的key |
示例
@RestController
@RequestMapping("/spring")
public class SpringController {
@GetMapping("/testSessionAttribute")
public void testSessionAttribute(@SessionAttribute("key") String val) {
System.out.println(val);
}
}