@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);
    }
posted on 2021-11-22 19:58  飞飞乐园  阅读(42)  评论(0编辑  收藏  举报