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; }