一、@JsonView注解的简介
@JsonView是jackson json中的一个注解,Spring webmvc也支持这个注解,它的作用就是控制输入输出后的json
二、@JsonView注解的使用步骤
1.使用接口来声明多个视图
package com.knyel.dto; public class User { public interface UserSimpleView {}; public interface UserDetailView extends UserSimpleView {}; private String username; private String password; public String getUsername (){ return username; } public void setUsername (String username){ this.username = username; } public String getPassword (){ return password; } public void setPassword (String password){ this.password = password; } @Override public String toString (){ return "User{" + "username='" + username + '\'' + ", password='" + password + '\'' + '}'; } }
2.在值对象的get方法上指定视图
package com.knyel.dto; import com.fasterxml.jackson.annotation.JsonView; 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; } @Override public String toString (){ return "User{" + "username='" + username + '\'' + ", password='" + password + '\'' + '}'; } }
3.在controller方法上指定视图
package com.knyel.wb.controller; import com.fasterxml.jackson.annotation.JsonView; import com.knyel.dto.User; import com.knyel.dto.UserQueryCondition; import org.springframework.data.web.PageableDefault; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.springframework.data.domain.Pageable; import java.util.ArrayList; import java.util.List; @RestController public class UserController { @RequestMapping(value = "/user",method = RequestMethod.GET) @JsonView(User.UserSimpleView.class) public List<User> query(UserQueryCondition userQueryCondition, @PageableDefault(page=1,size=10,sort="username,asc") Pageable pageable){ System.out.println(pageable.getPageNumber()); System.out.println(pageable.getSort()); System.out.println(pageable.getPageSize()); System.out.println(userQueryCondition.toString()); List<User> users=new ArrayList<>(); users.add(new User()); users.add(new User()); users.add(new User()); return users; } @RequestMapping(value="/user/{id:\\d+}",method = RequestMethod.GET) @JsonView(User.UserDetailView.class) public User getInfo(@PathVariable String id){ User user=new User(); user.setUsername("knyel"); System.out.println(user); return user; } }
4.测试类
package com.knyel.controller; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; @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 whenQuerySuccess () throws Exception{ String result=mockMvc.perform(MockMvcRequestBuilders.get("/user") .param("username","knyel") .param("age","18") .param("ageTo","60") .param("phone","110") .param("size","15") .param("page","2") .param("sort","age,desc") .contentType(MediaType.APPLICATION_JSON_UTF8)) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value("3"))//查询的根元素,例如$.length()代表整个传过来的json的文档 .andReturn().getResponse().getContentAsString(); System.out.println(result); } @Test public void whenGenInfoSuccess() throws Exception{ String result=mockMvc.perform(MockMvcRequestBuilders.get("/user/1") .contentType(MediaType.APPLICATION_JSON_UTF8)) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$.username").value("knyel")) .andReturn().getResponse().getContentAsString(); System.out.println(result); } @Test public void whenGetInfoFail() throws Exception{ mockMvc.perform(MockMvcRequestBuilders.get("/user/a") .contentType(MediaType.APPLICATION_JSON_UTF8)) .andExpect(MockMvcResultMatchers.status().is4xxClientError()); } }
whenQuerySuccess的返回值为:
[{"username":null},{"username":null},{"username":null}]
whenGetInfoSuccess的返回值为:
{"username":"knyel","password":null}
对于带有分页查询的例子
@Test public void whenGetDwbzxxSuccess() throws Exception{ String result=mockMvc.perform(MockMvcRequestBuilders.get("/dwbzxx/findDwbzxx") .param("limit", "10") .param("offset", "0") .param("dwdmYj", "1399") .param("dwdmEj", "28e516432383411b8fac66a2b8ff08bf") .contentType(MediaType.APPLICATION_JSON)) .andReturn().getResponse().getContentAsString(); System.out.println(result); }