Restful API注解之@PathVariable和@JsonView详解

2023-11-07

**对于restful API的使用可以查看我之前的文章SpringMVC开发restful API查询请求
本文将在restful API的基础上介绍@PathVariable和@JsonView注解的详细使用方式。**

一、@PathVariable注解的使用

在restful API中的URL地址一般传递的是资源,不同于传统的URL中传递的是用户行动信息。使用@PathVariable注解可以将URL中的片段映射到Java代码中,下面我们来举例说明。

1.使用MockMvc伪造客户端请求来测试

@Test
    public void whenGetSuccess() throws Exception {
        String result=mockMvc.perform(get("/user/1")
                .contentType(MediaType.APPLICATION_JSON_UTF8))
                .andExpect(status().isOk())
                .andExpect((ResultMatcher) jsonPath("$.username").value("shinelon"))
                .andReturn().getResponse().getContentAsString();
        System.out.println(result);
    }

2.controller控制层方法代码:

    @GetMapping("/user/{id}")
    @JsonView(User.DetailJsonView.class)
    public User get(@PathVariable String id) {
        User user=new User();
        user.setUsername("shinelon");
        return user;
    }

如上代码所示,在get方法参数上使用@PathVariable就会将路径中的参数id映射到String类型的方法的形参上,这个注解类似于@RequestParam注解,我们也可以在路径中使用正则表达式来限制传递参数,比如id必须为数字:

@GetMapping("/user/{id:\\d+}")

@PathVariable注解使用不难,很简单,这里就简单介绍一下,下面重点介绍@JsonView注解的使用。

@JsonView注解的使用
@JsonView注解有什么功能呢?首先我们在平时做项目的时候会有下面的场景,比如我们在查询的时候在不同方法上查询不同的字段,比如用户简单的信息只需要用户名称等,不需要用户密码,而有时候用户详情中就需要用户密码来展示出来。如果不使用@JsonView注解,我们可能需要多多查询字段或者封装实体类来解决。下面我们就依照上面讲解的场景来介绍一下该注解的使用方法。

下面说明如何使用@JsonView注解:

  1. 使用接口来声明多个视图
  2. 在值对象的get方法上指定视图
  3. 在controller方法上指定视图

1.我们在User实体类中声明两个接口,一个SimpleJsonView视图不展示用户密码,DetailJsonView展示用户密码,DetailJsonView继承SimpleJsonView就是说SimpleJsonView需要展示的信息DetailJsonView都会展示。

//1.声明接口
    public interface SimpleJsonView{}
    public interface DetailJsonView extends SimpleJsonView{}

2.在每一个字段的get方法上指定视图:

    //2.在值对象的get方法上指定视图
    @JsonView(SimpleJsonView.class)
    public String getUsername() {
        return username;
    }
    @JsonView(DetailJsonView.class)     //因为DetailJsonView继承了SimpleJsonView接口,所以它既会显示密码还会显示username
    public String getPassword() {
        return password;
    }
    @JsonView(SimpleJsonView.class)
    public Date getBirthday() {
        return birthday;
    }

3.在controller方法上指定视图:

@JsonView(User.SimpleJsonView.class)            //3.在controller上指定视图
    public List<User> query(UserQueryCondition condition,@PageableDefault(size=15,page=3,sort="username.asc") Pageable pageable){
        System.out.println(ReflectionToStringBuilder.toString(condition,ToStringStyle.MULTI_LINE_STYLE));

        List<User> list=new ArrayList<User>();
        list.add(new User());
        list.add(new User());
        list.add(new User());
        return list;
    }

    @GetMapping("/user/{id:\\d+}")
    @JsonView(User.DetailJsonView.class)
    public User get(@PathVariable String id) {
        User user=new User();
        user.setUsername("shinelon");
        return user;
    }

通过上面的三部我们已经完成了@JsonView注解的使用,下面是实体类和controller完整的代码:
User.java:

public class User {
    //使用jsonview来显示视图
    //1.声明接口
    public interface SimpleJsonView{}
    public interface DetailJsonView extends SimpleJsonView{}
    private int id;
    public String username;
    public String password;
    private Date birthday;
    public void setUsername(String username) {
        this.username = username;
    }
    //2.在值对象的get方法上指定视图
    @JsonView(SimpleJsonView.class)
    public String getUsername() {
        return username;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @JsonView(DetailJsonView.class)     //因为DetailJsonView继承了SimpleJsonView接口,所以它既会显示密码还会显示username
    public String getPassword() {
        return password;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getId() {
        return id;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    @JsonView(SimpleJsonView.class)
    public Date getBirthday() {
        return birthday;
    }
}

UserController.java:

@RestController
public class UserController {
    @JsonView(User.SimpleJsonView.class)            //3.在controller上指定视图
    public List<User> query(UserQueryCondition condition,@PageableDefault(size=15,page=3,sort="username.asc") Pageable pageable){
        System.out.println(ReflectionToStringBuilder.toString(condition,ToStringStyle.MULTI_LINE_STYLE));
        List<User> list=new ArrayList<User>();
        list.add(new User());
        list.add(new User());
        list.add(new User());
        return list;
    }
    //\\d+这个正则表达式表示接受的参数是整型
    @GetMapping("/user/{id:\\d+}")
    @JsonView(User.DetailJsonView.class)
    public User get(@PathVariable String id) {
        User user=new User();
        user.setUsername("shinelon");
        return user;
    }
    }

下面使用MockMvc伪造请求进行测试:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserControllerTest {
    @Autowired
    private WebApplicationContext wac;

    private MockMvc mockMvc;

    @Before
    public void setup() {
        mockMvc=MockMvcBuilders.webAppContextSetup(wac).build();
    }

    @Test
    public void whenQuery() throws Exception {
        String result=mockMvc.perform(get("/user")
        .contentType(MediaType.APPLICATION_JSON_UTF8))
        .andExpect(status().isOk())
        .andExpect(jsonPath("$.length()").value(3))
        .andReturn().getResponse().getContentAsString();    
        System.out.println(result);

    }

    @Test
    public void whenGetSuccess() throws Exception {
        String result=mockMvc.perform(get("/user/1")
                .contentType(MediaType.APPLICATION_JSON_UTF8))
                .andExpect(status().isOk())
                .andExpect((ResultMatcher) jsonPath("$.username").value("shinelon"))
                .andReturn().getResponse().getContentAsString();
        System.out.println(result);
    }
    }

当我们测试whenQuery方法的时候看到查询结果并没有显示密码,因为在controller的方法注解指定SimpleJsonView视图:
这里写图片描述

当我们测试whenGetSuccess方法时密码将会展示出来:
这里写图片描述


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Restful API注解之@PathVariable和@JsonView详解 的相关文章

随机推荐

  • 【交叉二五码及其校验码计算方式】

    一 交叉二五码 交叉二五码是1972年美国Intermec公司发明的一种条 空均表示信息的连续型 非定长 具有自校验功能的双向条码 它的字符集为数字字符0 9 交叉二五条码由左侧空白区 起始符 数据符 终止符及右侧空白区构成 它的每一个条码
  • CentOS 7虚拟机安装常用软件

    依然是虚拟机安装常用软件系列 CentOS 7目前官方支持到2024 还行 1 VMWare 安装CentOS 7 默认都安装成功了 2 换源 更新 阿里源最近老是403 换了网易源 sudo wget O etc yum repos d
  • python对字符串中指定字符进行替换

    1 替换指定的所有字符 string replace a b 表示将字符串string中所有字符为a的替换为b 例子 string abcabcabc string string replace a b print string 输出 bb
  • SpringBoot默认Json框架Jackson解析-基础篇

    1 Springboot返回JSON数据的方式 目前SpringBoot提供的Json格式有三种 Jackson 默认 Gson JsonB 我们都可以在springboot自动配置模块spring boot autoconfigure中查
  • (深度/广度优先算法)——遍历邻接表(C语言)

    一 算法代码 采用邻接表表示图的遍历 include
  • 基于同一IP的不同端口访问不同的网站

    目录 创建网站目录 一 ip 端口1的根目录 二 ip 端口2的根目录 编写虚拟主机配置文件 配置完成 实验结果测试 创建网站目录 一 ip 端口1的根目录 这个目录大家可以随意 配置文件里同步即可 mkdir p www port 909
  • 嵌入式系统:中断

    中断 一 查询与中断 1 查询 按照主函数中的语句顺序 顺序执行 1 优点 结构简单 易于理解 2 缺点 无法充分利用CPU资源 2 中断 程序顺序执行 遇到中断使能 跳转执行中断函数 1 优点 充分利用CPU资源 提高效率 易于处理突发事
  • 微信小程序里面如何使用svg图片

    首先准备一段svg代码如下
  • 查找随机数组中的质数个数

    看到这个标题 我们首先要想到几个问题来仔细分析 1 随机数如何生成 2 质数是为何物 下面我们就来一一解决刚刚想到的问题 1 随机数 我们假设想生成1000以内的21个随机数 Dim i As Integer x As Integer Ra
  • 【financial markets】 2. EURIBOR

    1 EURIBOR EURIBOR 全称是 EURO Interbank offered rate 相当于 欧元的LIBOR 与EONIA一样 EURIBOR是无担保的银行间借贷利率 但是有两点很明显的不同 1 EURIBOR的也是取平均数
  • Docker搭建FastDFS

    Docker搭建FastDFS 1 搜索镜像 docker search fastdfs root localhost data docker search fastdfs NAME DESCRIPTION STARS OFFICIAL A
  • java 定时任务之一 @Scheduled注解(第一种方法)

    本文仅供参考 使用spring Scheduled注解执行定时任务 步骤 1 xmlns 添加 http www springframework org schema task http www springframework org sc
  • CentOS下postgres怎么恢复数据库.bak文件_Xtrabackup 实现数据的备份与恢复

    Xtrabackup介绍 Xtrabackup是由percona开源的免费数据库热备份软件 它能对InnoDB数据库和XtraDB存储引擎的数据库非阻塞地备份 对于MyISAM的备份同样需要加表锁 mysqldump备份方式是采用的逻辑备份
  • 加密SO文件中自定义的section

    加密SO文件中自定义的section 作者 0n1y3nd丶 分类 Android 发布时间 2014 08 29 18 22 61条评论 前言 加密已知so文件中的某一section 在运行时解密 执行里面的代码 0 1 libsyc s
  • vim q:适合更多操作的命令行窗口。

    最简单的命令行窗口 输入命令 但是 如果想复制内容到命令行窗口 怎么办 有一种方法 在正常模式下 输入 q 就打开了命令行窗口 命令行窗口中都是我们输入过的命令 在这个窗口中我们可以像编辑正文一样编辑新的命令 或修改旧的命令 因为像编辑普通
  • ChatGPT常见错误解决和封号情形说明

    1 ChatGPT国内能用吗 答 ChatGPT官网国内IP不能 包括港澳台 最好用美国IP 所以需要魔法才能访问官网 这块内容懂得都懂 不敢写教程 只能各位自行搞定 搞不定还是老实用国内的 2 登录遇到ChatGPT高峰期 解决办法 遇到
  • 深度学习-无监督学习(2)

    一 简介 接续上一节我们对无监督学习的介绍 接下来我们将对其中的两大模块展开介绍 在介绍之前会对流行数据让大家有一定的了解 二 无监督学习 数据流形 流形学习的目标是在保持特征特性的同时 将原来位于高维空间中的数据嵌入到低维空间中 这是可能
  • gcc 4.9 g++ gfortran 安装

    Linux编译安装GCC 4 9 0 有需要的朋友可以参考下 Linux下编写C C 程序自然缺不了一个优秀的编译器 Linux下比较常见的自然是GCC了 最近GCC也出到了4 9 0版本 对于C 11 14也有了更好的支持了 所以 今天我
  • 5.4 龙贝格算法

    为什么有龙贝格算法 龙贝格算法是一种数值积分方法 用于计算定积分的数值近似值 它是基于复合梯形法和复合辛普森法的推广和拓展 可以达到更高的精度 相较于复合梯形法和复合辛普森法 龙贝格算法的收敛速度更快 且误差更小 因此在计算积分时更加精确
  • Restful API注解之@PathVariable和@JsonView详解

    对于restful API的使用可以查看我之前的文章SpringMVC开发restful API查询请求 本文将在restful API的基础上介绍 PathVariable和 JsonView注解的详细使用方式 一 PathVariabl