Controller层传参时常用的注解

目录

0. 总结

1. 无注解

1.1 代码

1.2 示例

2. @RequestParam注解

 2.1 @RequestParam源码

2.2 示例

2.2.1 示例1

2.2.2 示例2

3. @RequestBody注解

3.1 源码

3.2 示例

3.2.1 实体类

 3.2.2 Controller层

3.2.3 发送请求

4. @PathVariable注解

4.1 示例


0. 总结

@RequestParam 适用于普遍一般情况

@RequestBody 适用于传递复杂对象,以及文件等复杂数据

@ PathVariable 适用于RestFul风格时

1. 无注解

没有对参数添加注解也可以使用,但是不推荐

1.1 代码

User实体类

@Data
@Component
public class User {
    private Integer id ;
    private String name ;

}

Controller层

@RestController
public class UserController {
        @Resource
        private User user ;
        
        @GetMapping("/no_annotate")
        public User get(Integer id,String name) {
            user.setId(id);
            user.setName(name);
            return user;
        }
}

1.2 示例

 可见,id与name都没有使用注解

传递空参数时,spring框架将参数设为了默认null值

也可以看到,在传递参数时,也能够正确传递,传递错误的参数也能将其过滤掉

2. @RequestParam注解

这是比较常用的注解

 2.1 @RequestParam源码

可以看出该注解一共有三个属性可供选择:

name/value属性:用于指定参数的名称

required:是否需要该参数,默认为需要(true)

defaultValue:参数默认值

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
    @AliasFor("name")
    String value() default "";

    @AliasFor("value")
    String name() default "";

    boolean required() default true;

    String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}

2.2 示例

2.2.1 示例1

此时两个参数都添加了@RequestParam注解,并且注解属性都为默认值

@RestController
public class UserController {
        @Resource
        private User user ;

        @GetMapping("/requestParam")
        public User getByRequestParam(@RequestParam Integer id,@RequestParam String name) {
            user.setId(id);
            user.setName(name);
            return user;
        }

}

 可见,当添加了该注解之后,required设置为了true,不传参数时,直接报错

可见,当正确传递参数后,能够正确处理 

2.2.2 示例2

给参数设置名称

    @GetMapping("/requestParam")
    public User getByRequestParam(@RequestParam Integer id,@RequestParam(name = "username") String name) {
        user.setId(id);
        user.setName(name);
        return user;
    }

 可见,该参数名称已经变为了“username",使用”name“传递时发生了错误。

 使用”username"传递时,处理成功

3. @RequestBody注解

该注解常用于处理复杂的传参,例如嵌套对象,接收上传的文件或二进制数据

3.1 源码

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestBody {
    boolean required() default true;
}

该注解的属性只有一个required属性,默认为true,即参数必须传递

3.2 示例

以传递嵌套对象为示例,浏览器传递太麻烦,使用postman发送请求

3.2.1 实体类

@Data
public class Address {
    private String city;
    private String zipcode;

}
@Data
@Component
public class Admin {
    private String name ;
    private Address address;
}

 3.2.2 Controller层

使用Admin传参,其中一个使用@RequestBody,另一个使用@RequestParam形成对比

@RestController
@RequestMapping("/admin")
public class AdminController {
    @Resource
    private Admin admin ;

    @PostMapping("/requestBody")
    public Admin getByRequestBody(@RequestBody Admin admin) {
        this.admin.setName(admin.getName());
        this.admin.setAddress(admin.getAddress());
        return admin;
    }

    @PostMapping("/requestParam")
    public Admin getByRequestParam(@RequestParam Admin admin) {
        this.admin.setName(admin.getName());
        this.admin.setAddress(admin.getAddress());
        return admin;
    }
}

3.2.3 发送请求

首先测试@RequestBody注解,发现返回成功

localhost:8081/admin/requestBody
{
    "name": "John",
    "address": {
        "city": "New York",
        "zipcode": "10001"
    }
}

 接着测试@RequestParam,发现返回了400错误。由此可得出,当需要传递复杂数据,例如嵌套对象时,需要使用@RequestBody。

localhost:8081/admin/requestParam

4. @PathVariable注解

当前后端传递参数使用RESTful 风格时,需要采用该注解。 

4.1 示例

@RestController
public class UserController {
        @Resource
        private User user ;

        @GetMapping("/user/{id}")
        public User getByPath(@PathVariable Integer id) {
            user.setId(id);
            return user;
        }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值