zoukankan      html  css  js  c++  java
  • 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;
        }
    
  • 相关阅读:
    SQL Server 中,将多行转换为一行,用某个符号隔开的SQL 语句
    JQ 轻松学会$.get(),$.post(),$ajax()的作用和用法
    Dynamics 365 组织服务查询时,关于输入时间和输出时间的时区问题讲解
    在Dynamics 365的标准窗体,lookup字段变成了[Object Object],picklist直接展示数字
    C# 回顾正则表达式的常用语法
    观洛马琴科对决洛佩兹比赛有感
    读取硬盘序列号
    delphi 数组复制利用CopyMemory 最为完美
    MFC多线程通讯--自定义消息
    MFC 多线程及线程同步
  • 原文地址:https://www.cnblogs.com/minet/p/12597354.html
Copyright © 2011-2022 走看看