美文网首页
@JsonView的使用

@JsonView的使用

作者: 怪诞140819 | 来源:发表于2018-10-09 09:28 被阅读302次

1.使用场景

在某一些请求返回的JSON中,我们并不希望返回某些字段。而在另一些请求中需要返回某些字段。
例:用户对象


用户类图
  • 查询列表请求中,不返回password字段
  • 获取用户详情中,返回password字段

2.实现

2.1 @JsonView的使用步骤

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

2.2 完整事例代码

2.2.1User对象定义

public class User{

    /**
     * 用户简单视图
     */
    public interface UserSimpleView{};

    /**
     * 用户详情视图
     */
    public interface UserDetailView extends UserSimpleView{};

    private String username;

    private String password;

    private String age;

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

    @JsonView(UserSimpleView.class)
    public String getAge() {
        return age;
    }
    
    public void setAge(String age) {
        this.age = age;
    }
}
  • 这里完成了步骤1和步骤2
  • 定义了步骤1的两个视图接口UserSimpleViewUserDetailView,UserDetailView继承UserSimpleViewUserDetailView拥有视图UserSimpleView的属性
  • 完成了步骤2的在相应的get方法上声明JsonView

2.2.2 定义UserController

@RestController
public class UserController {

    @GetMapping("/user")
    @JsonView({User.UserSimpleView.class})
    public List<User> query(UserQueryCondition userQueryCondition, @PageableDefault(size = 10,page=1,sort = {"username","age"},direction = Sort.Direction.DESC) Pageable pageable){
        System.out.println(userQueryCondition);
        System.out.print(pageable.getPageSize());
        System.out.println(pageable.getSort());
        System.out.println(pageable.getOffset());
        List<User> users = new ArrayList<>();
        users.add(new User());
        users.add(new User());
        users.add(new User());
        return users;
    }

    /**
     * 在url中使用正则表达式
     * @param id
     * @return
     */
    @GetMapping("/user/{id:\\d+}")
    @JsonView(User.UserDetailView.class)
    public User get(@PathVariable String id){
        System.out.println(id);
        User user = new User();
        user.setUsername("tom");
        return user;
    }
}
  • 完成步骤3,在不同Controller的方法上使用视图

2.2.3 测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserControllerTest {

    @Autowired
    private WebApplicationContext webApplicationContext;

    private MockMvc mockMvc;

    @Before
    public void setup(){

        //根据webApplicationContext构建mockMvc
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }

    @Test
    public void whenQuerySuccess() throws Exception {
        String result = mockMvc.perform(MockMvcRequestBuilders.get("/user")
                        .param("username","tom")
                        .param("age","11")
                        .param("ageTo","30")
                        .param("page","20")
                        .param("pageSize","100")
                        .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);
    }

    /**
     * 请求成功逻辑测试
     * @throws Exception
     */
    @Test
    public void wherGetSuccess() throws Exception {
        String result = mockMvc.perform(MockMvcRequestBuilders.get("/user/1")
                        .contentType(MediaType.APPLICATION_JSON_UTF8))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.jsonPath("$.username").value("tom"))
                .andReturn().getResponse().getContentAsString();
        System.out.println(result);
    }

    /**
     * 路径正则表达式的匹配规则测试
     * @throws Exception
     */
    @Test
    public void whenGetFail() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/user/a")
                        .contentType(MediaType.APPLICATION_JSON_UTF8))
                .andExpect(MockMvcResultMatchers.status().is4xxClientError());
    }


}
  • 测试结果
  • 查询全部的返回结果没有password字段
[{"username":null,"age":null},{"username":null,"age":null},{"username":null,"age":null}]
  • 查询详情的返回结果有password字段
{"username":"tom","password":null,"age":null}

相关文章

  • 使用Spring MVC 开发 RESTful API(@Jso

    使用Spring MVC 开发 RESTful API(@JsonView的使用) @JsonView使用步骤 1...

  • plugin-jsonview

    安装jquery.jsonview.min.cssjquery.jsonview.min.js 使用 参考暂无

  • @JsonView的使用

    1.使用场景 在某一些请求返回的JSON中,我们并不希望返回某些字段。而在另一些请求中需要返回某些字段。例:用户对...

  • 后端小技巧--tips

    1.枚举使用 2.序列化 Jackson@JsonView 简单介绍通过添加@jsonView 注解指定输出对象

  • JsonView插件的使用

    由于谷歌浏览器经常打不开应用商店,还有就是安装第三方插件的办法。方法就如下:由于最近做和json相关的东西,所以,...

  • Chrome JSONview 插件使用

    通过浏览器请求到json数据后,是没有格式化密密麻麻的一片 然后点击视图 使json数据可视化 方法二、安装JSO...

  • jsonView

    @jsonView使用步骤 使用接口来声明多个视图 在值对象的get方法上指定视图使用接口声明多个视图 并在ge...

  • 使用Spring MVC返回jsonp数据

    jsonp在调用端的用法 // TODO:待完成 MappingJackson2JsonView类的使用 在Spr...

  • 日常总结(一)

    1、自定义异常抛出异常格式定义 2、 @JsonView使用步骤 (1)使用接口来声名多个视图 (2)在值对象的...

  • chrome接口json数据格式化

    安装chrome插件JSONView

网友评论

      本文标题:@JsonView的使用

      本文链接:https://www.haomeiwen.com/subject/lvzsaftx.html