@RestController注解:相当于@ResponseBody+@Controller的合体
@ResponseBody会自动将控制器中方法的返回值写入到HTTP响应中。
@RestController返回json数据不需要在方法前加@ResponseBody注解,但是不能返回jsp,html页面,视图解析器无法解析jsp,html页面
@Controller
在对应方法上,视图解析器可以解析return的jsp,html页面,并跳转到相应页面
如果返回json等内容到页面,还需要加@ResponseBody注解
@ControllerAdvice
在Spring 3.2中,新增了@ControllerAdvice、@RestControllerAdvice 注解,
可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping、@PostMapping, @GetMapping注解中,
可对controller中被 @RequestMapping注解的方法加一些逻辑处理.
使用这个 Controller ,可以实现三个方面的功能:
全局异常处理,全局数据绑定,全局数据预处理
具体用法可参照:https://www.cnblogs.com/lenve/p/10748453.html
例子:
定义全局类
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.ui.Model;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Slf4j
@RestControllerAdvice
public class RestAdviceConfig {
/**
* 全局异常捕获:
* @ExceptionHandler 注解用来指明异常的处理类型
* 可以定义多个方法,不同的方法处理不同的异常
* @param e
* @return
*/
@ExceptionHandler(BindException.class)
@ResponseStatus(HttpStatus.OK)
public String handleError(BindException e) {
log.warn("参数绑定失败", e.getMessage());
BindingResult result = e.getBindingResult();
List<FieldError> fieldErrorList = result.getFieldErrors();
StringBuilder stringBuilder = new StringBuilder();
for (FieldError error : fieldErrorList) {
String message = String.format("%s:%s;", error.getField(), error.getDefaultMessage());
stringBuilder.append(message);
}
return stringBuilder.toString();
}
/**
* 局数据绑定:应用到所有@RequestMapping注解方法
* 此处将键值对添加到全局,注解了@RequestMapping的方法都可以获得此键值对
* @param model
*/
@ModelAttribute
public void addUser(Model model) {
model.addAttribute("name1", "lisi");
model.addAttribute("age1", "9");
model.addAttribute("msg", "此处将键值对添加到全局,注解了@RequestMapping的方法都可以获得此键值对");
}
/**
* 全局数据预处理
* 应用到所有@RequestMapping注解方法,在其执行之前初始化数据绑定器。用来设置WebDataBinder
* @param binder
*/
@InitBinder("user")
public void initBinder(WebDataBinder binder) {
binder.setFieldDefaultPrefix("user.");
}
}
实体类
import lombok.Data;
import javax.validation.constraints.Max;
@Data
public class User {
private String name;
private String sex;
@Max(value=10,message = "年龄不能超过10岁。")
private int age;
}
Controller
@GetMapping("/getObject")
@ApiOperation(value = "对象参数get请求示例")
public User getExObject(@Valid User user, Model model) {
System.out.println(JSONUtil.toJsonStr(user));
Map<String, Object> map = model.asMap();
System.out.println(map.get("name1"));
System.out.println(map.get("msg"));
System.out.println(map.get("age1"));
return user;
}
参数验证异常(由全局类捕获到异常):
成功:
全局变量被获取
其他常用注解
序列 | 注解 | 说明 |
---|---|---|
1 | @RequestBody | 前端传的json形式。在处理请求方法的参数列表中使用,它可以将请求主体中的参数绑定到一个对象中,请求主体参数是通过HttpMessageConverter传递的,根据请求主体中的参数名与对象的属性名进行匹配并绑定值。此外,还可以通过@Valid注解对请求主体中的参数进行校验。 |
2 | @Valid | 验证注解,可以验证对象中的每个字段。当不符合要求时就会在方法中返回message 的错误提示信息 |
3 | @RequestParam | 前端传入的参数可多个,将方法的参数与Web请求的传递的参数进行绑定。使用@RequestParam可以轻松的访问HTTP请求参数的值 |
3 | @PathVariable | 通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过@PathVariable(“xxx“) 绑定到操作方法的入参中 |
3 | @ModelAttribute | 前端传入的参数可多个,将方法的参数与Web请求的传递的参数进行绑定。使用@RequestParam可以轻松的访问HTTP请求参数的值 |
4 | @Component | 定义bean,被用在要被自动扫描和装配的类上 |
5 | @Bean | 定义bean。@Bean是一个方法级别上的注解,添加的bean的id为方法名 使用场景:在配置类中使用,即类上需要加上@Configuration注解的类 @Component倾向于组件扫描和自动装配。 但有时自动设置是做不到的。 假如你要引入第三方库,可是如果你没有源代码,也就无法在其上添加@Component,自动设置也就无从下手。 但@Bean会返回一个被spring认可的Bean。@Bean所注释的方法内部可以对这个第三方库的实例进行设置。 |
6 | @Repository(“名称”) | @Component的dao层衍生注解 |
7 | @Service(“名称”) | @Component的service层衍生注解 |
8 | @Controller(“名称”) | @Component的controller层衍生注解 |
9 | @Autowired | 自动根据类型注入bean |
10 | @Resource(“名称”) | 自动根据名称注入bean |
11 | @JsonFormat @DateTimeFormat |
前端 传给 后端。 当前端传来的是键值对,用@DateTimeFormat 规定接收的时间格式。 当前端传来json串,后台用@ReuqestBody接收,用@JsonFormat 规定接收的时间格式。 后端 传给 前端。 后端返回给前端的时间值,只能用@JsonFormat 规定返回格式,@DateTimeFormat 无法决定返回值的格式。 |
12 | @NotBlank | 验证注解的字符串元素值不为空(只用于字符串) |
13 | @NotEmpty | 验证注解的元素值不为null且不为空(只用于字符串,集合,map) |
14 | @NotNull | 验证注解的元素值不为null且不为空(适用所有类型) |
15 | @Pattern | 根据正则对字符串进行验证(只适用于字符串)@Pattern(regexp = "\w{3}[0-9]{7}$",message = "后七位必须是七位数字") |
16 | @Size(min=, max=) | 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内 |
17 | @Length(min=, max=) | 验证字符串的长度 |
18 | @Past | 验证 Date 和 Calendar 对象是否在当前时间之前 |
19 | @Future | @Future 验证 Date 和 Calendar 对象是否在当前时间之后 |
20 | @Min,@Max | 验证 Number 和 String 对象是否大(小)等于指定的值 |
20 | @Digits(integer=,fraction=) | 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。 |
20 | @Range(min=10000,max=50000,message="") | 元素必须在合适的范围内 |
例子:
@PostMapping("/save")
public boolean save(@Valid @RequestBody Color color, @RequestParam(value = "id", required = false) String id) {
return colorService.save(color,id);
}
@GetMapping(value = "/list/{id}")
public List<String> list(@PathVariable("id") String id) {
return service.list(id);
}
所有博客均为自己学习的笔记。如有错误敬请理解。