Spring Security入门(五) 使用Spring MVC开发RESTful API-编写用户详情服务

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33248299/article/details/89368436

一.导学

  • 编写用户详情服务

    • @PathVariable映射url片段到java方法的参数
    • 在url声明中使用正则表达式
    • @JsonView控制json输出内容
  • 写用户详情服务前先写一个测试用例

二.编写测试用例

@Test
    public void whenGetInfoSuccess()throws Exception{
        mockMvc.perform(MockMvcRequestBuilders.get("/user/1")
        .contentType(MediaType.APPLICATION_JSON_UTF8))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.jsonPath("$.username").value("playmaker"));
      
    }

三.编写处理api

@RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
    public User getInfo(@PathVariable String id){
        User user = new User();
        user.setUsername("playmaker");
        return user;
    }

在这里插入图片描述

  • PathVariable参数说明

    • name:提供别名和路径中一致。默认路径中的名称和方法入参一致
    • value:值
    • required:是否必须
  • 在编写一个测试用例(我们只想让id为数字的接受处理)

 @Test
    public void whenGetInfoFail()throws Exception{
        mockMvc.perform(MockMvcRequestBuilders.get("/user/a")
        .contentType(MediaType.APPLICATION_JSON_UTF8))
                .andExpect(MockMvcResultMatchers.status().is4xxClientError());//所以期望404错误
    }
  • 然而返回的是200
  • 这里应该是匹配是不上正确的路径 应该返回404才对
  • 是因为服务没有区分id是否必须是数字
  • 所以我们用正则表达式
@RequestMapping(value = "/user/{id:\\d+}",method = RequestMethod.GET)
    public User getInfo(@PathVariable(name = "id") String idxxx){
        User user = new User();
        user.setUsername("playmaker");
        return user;
    }

  • 这样运行上边测试用例就没得问题了 返回的就是404
  • 实际开发中这里正则也许会更加麻烦的

四.@JsonView使用

  • 现在Controller有两个方法 一个query返回一个集合 一个getInfo 返回的User

  • User包含两个字段 username password

  • 假如我查询列表中不返回密码,想query不展示密码字段,Getinfo才展示密码字段,怎么做?

  • 这个注解用处就是这个 控制返回相同对象时 显示哪些字段

  • @JsonView 使用步骤

    • 使用接口来声明多个视图
    • 在值对象的get方法上指定视图
      • 经过测试:放在属性上也有效果
    • 在Controller方法上指定视图
public class User {

    public interface UserSimpleView{}  //简单视图
    public interface UserDetailView extends UserSimpleView{}//详细视图 

    private String username;
    private String password;

    @JsonView(UserSimpleView.class)
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
    @JsonView(UserDetailView.class) //因为详细视图继承自简单 所以可以显示出简单视图的东西
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

在这里插入图片描述

扫描二维码关注公众号,回复: 6043800 查看本文章
@Test
    public void whenQuerySuccess() throws Exception{
         String result = mockMvc.perform(MockMvcRequestBuilders.get("/user")
                 .param("username","123")
                 .param("age","20")
                 .param("ageTo","70")
                 .param("xxx","xxx")
                 .param("size","15")
                 .param("page","3")
                 .param("sort","age,desc")
                .contentType(MediaType.APPLICATION_JSON_UTF8))
                 .andExpect(MockMvcResultMatchers.status().isOk())
                 .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3))
                 .andReturn().getResponse().getContentAsString();
            System.out.println(result);
    }

    @Test
    public void whenGetInfoSuccess()throws Exception{
        String result =  mockMvc.perform(MockMvcRequestBuilders.get("/user/1")
        .contentType(MediaType.APPLICATION_JSON_UTF8))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.jsonPath("$.username").value("playmaker"))
                .andReturn().getResponse().getContentAsString();
            System.out.println(result);
    }
  • query的结果
  • 没有显示password
    在这里插入图片描述
  • getInfo的结果
  • 显示了password
    在这里插入图片描述

五.代码重构

@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping
    @JsonView(User.UserSimpleView.class)
    public List<User> query(UserQueryCondition condition, @PageableDefault() Pageable pageable){
        System.out.println(ReflectionToStringBuilder.toString(condition, ToStringStyle.MULTI_LINE_STYLE));

        System.out.println(pageable.getPageSize());
        System.out.println(pageable.getPageNumber());
        System.out.println(pageable.getSort());

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

    @GetMapping(value = "/{id:\\d+}")
    @JsonView(User.UserDetailView.class)
    public User getInfo(@PathVariable(name = "id") String idxxx){
        User user = new User();
        user.setUsername("playmaker");
        return user;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_33248299/article/details/89368436