springboot-注解篇

一、注解篇:

1、@RequestMapping和@GetMapping @PostMapping 区别
  • @GetMapping用于将HTTP get请求映射到特定处理程序的方法注解 具体来说,@GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。

  • @PostMapping用于将HTTP post请求映射到特定处理程序的方法注解 具体来说,@PostMapping是一个组合注解,是@RequestMapping(method =RequestMethod.POST)的缩写。

2、@RequestBody的使用

@RequestBody主要是用来接收前端传递过来的json字符串的数据(请求体中的数据)

使用@RequestBody注解需要注意以几点:

  • 前端:请求的必须以post方式提交数据,不能以get方式
  • 后端:同一个接收方法里@RequestBody和@RequestParam()可以同时使用
  • 前端传参是以请求体的方式,那么后端接收就要用@RequestBody来接收
  • 前端不是以请求体的方式,后端需要用@RequestParam()来接收
注:一个请求,只有一个@RequestBody;一个请求,可以有多个RequestParam()

注:同时使用@RequestBody和@RequestParam()时,原SpringMVC接收的机制不变
RequestBody接收的是请求体里面的数据,
RequestParam()接收的是key-value里面的参数
所以他会被切面进行处理可以是普通元素,集合,数组,对象等等

注:如果参数前写了@RequestParam(xxx),那么前端必须有对应的xxx名字才行(不管其是否有值当然可以通过设置该注解的required属性来调节是否必须传),如果没有xxx名的话,请求会出错,报400。
注:如果参数前不写@RequestParam(xxx),那么就前端可以有可以没有对应的xxx名字才行,如果有xxx名 的话,那么就会自动匹配;没有的话,请求也能正确发送。追注:这里与feign消费服务时不同;feign消费服务时,如果参数前什么也不写,那么会被默认是@RequestBody的。

json字符串中,如果value为""的话,后端对应属性如果是String类型的,那么接受到的就是"",如果是后端属性的类型是Integer、Double等类型,那么接收到的就是null。
json字符串中,如果value为null的话,后端对应收到的就是null。

附:@RequestBody与前端传过来的json数据解析 根据不同的Content-Type等情况,Spring-MVC会采取不同的HttpMessageConverter,实现来进行信息转换解析 最常用的:

  • 前端以Content-Type为application/json,传递json字符串数据
  • 后端以@RequestBody模型接收数据的情况

解析大体流程如下:

//deserializeFromObject(JsonParser p, DeserializationContext ctxt)方法
if (p.hasTokenId(JsonTokenId.ID_FIELD_NAME)) {
//获取json字符串中下一个key,这里即name1
            String propName = p.getCurrentName();
            do {
                p.nextToken();
              //根据name1,查询模型中是否有可setter的name1
                SettableBeanProperty prop = _beanProperties.find(propName);
                if (prop != null) { // normal case
                    try {
                    //若模型中有对应的setter的属性name1,就反序列化把json字符串中的对应值set给模型中的该属性
                        prop.deserializeAndSet(p, ctxt, bean);
                    } catch (Exception e) {
                        wrapAndThrow(e, bean, propName, ctxt);
                    }
                    continue;
                }
                //若模型中没有对应的setter的属性name1,那么进行此逻辑,除非有专门设置,否则一般"不做任何操作"
                handleUnknownVanilla(p, ctxt, bean, propName);
                //依次找出json字符串中所有的key,在以当前的key为基准,重复以上逻辑
                //进而完成json字符串到对象模型的转换
            } while ((propName = p.nextFieldName()) != null);
        }
        return bean;

 3、@JsonAlias注解和@JsonProperty注解

@JsonAlias注解,实现:json转模型时,json中key为Name或为name123或为name的都能识别,如下图栗子:

//entity类,实体数据
    @JsonAlias(Value={"Name","name123"})
    private String name;

 @JsonProperty注解,实现:json转模型时,key为MOTTO的能识别,但key为motto的不能识别,如下图栗子

//entity类,实体数据
    @JsonProperty("AGE")
    private String age;

@JsonAlias注解需要依赖于setter、getter,而@JsonProperty注解不需要

在不考虑上述两个注解的一般情况下,key与属性匹配时,默认大小写敏感

有多个相同的key的json字符串中,转换为模型时,会以相同的几个key中,排在最后的那个key的值给模 型属性复制,因为setter会覆盖原来的值,见以下栗子

传参为
{
	"age": "12",
	"name": "jack",
	"gender":"女",
	"gender":"男"
}
返回为
{name='jack', age='12',gender='男'}

 后端@RequestBody注解对应的类,在将HTTP的输入流(含请求体)装配到目标类(即:@RequestBody后面 的类)时,会根据json字符串中的key来匹配对应实体类的属性,如果匹配一致且json中的该key对应的值, 符合实体类的对应属性的类型要求,会调用实体类的setter方法将值赋给该属性

4、@ComponentScan
springboot启动类配置扫描
  • 当启动类和controller在同一类中时,需要在该类上添加注解@Controller;
  • 当启动类和controller分开时,启动类要放在根目录下,启动类上只有注解@SpringBootApplication;
  • 当启动类和controller分开时,如果启动类在某个包下,需要在启动类中增加注解@ComponentScan,配置需要扫描的包名
5、@PathVariable

映射URl绑定的占位符

//@PathVariable可以用来映射URL中的占位符到目标方法的参数中
@RequestMapping("/testPathVariable/{id}")
    public String testPathVariable(@PathVariable("id") Integer id)
    {
        System.out.println("testPathVariable:"+id);
        return SUCCESS;
    }

 

posted @ 2020-03-30 11:18  Minet米奈  阅读(244)  评论(0编辑  收藏  举报