看到一個新的注解以前沒有用過,記錄一下使用方法。
注意是:com.fasterxml.jackson.annotation.JsonView
@JsonView可以過濾pojo的屬性,使Controller在返回json時候,pojo某些屬性不返回,比如User的密碼,一般是不返回的,就可以使用這個注解。
@JsonView使用方法:
1,使用接口來聲明多個視圖
2,在pojo的get方法上指定視圖
3,在Controller方法上指定視圖
例子:條件查詢時候不返回用戶的密碼,查看詳情時候返回用戶的密碼
User:
package com.imooc.dto; import com.fasterxml.jackson.annotation.JsonView; public class User { public interface UserSimpleView {}; public interface UserDetailView extends UserSimpleView{}; //繼承 private String username; private String password; //UserSimpleView視圖有 @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 + "]"; } }
Controller:
package com.imooc.web.controller; import java.util.ArrayList; import java.util.List; import org.springframework.data.domain.Pageable; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.fasterxml.jackson.annotation.JsonView; import com.imooc.dto.User; import com.imooc.dto.UserQueryCondition; @RestController @RequestMapping("/user") public class UserController { /** * @Description: 條件查詢 * @param @param condition * @param @param pageable * @param @return * @return List<User> * @throws * @author lihaoyang * @date 2018年2月24日 */ @GetMapping("query") @JsonView(User.UserSimpleView.class) public List<User> query( //@RequestParam(value="username",required=false,defaultValue="lhy") String username UserQueryCondition condition , Pageable pageable){ // System.err.println(username); System.err.println(condition.toString()); System.err.println(pageable.toString()); List<User> users = new ArrayList<User>(); users.add(new User()); users.add(new User()); users.add(new User()); return users; } /** * 詳情 * @Description: TODO * @param @param id * @param @return * @return User * @throws * @author lihaoyang * @date 2018年2月24日 */ @GetMapping("detail/{id:\\d+}") //{}里可以是正則,匹配數字 // @GetMapping("detail/{id}") @JsonView(User.UserDetailView.class) public User getInfo(@PathVariable(value="id",required=true) String id){ System.err.println(id); User user = new User(); user.setUsername("tom"); return user; } }
測試用例:
package com.imooc.web.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 webCtx; //偽造mvc private MockMvc mockMvc; @Before public void setup(){ mockMvc = MockMvcBuilders.webAppContextSetup(webCtx).build(); } /** * 查詢 */ @Test public void whenQuerySuccess() throws Exception{ String result = mockMvc.perform(MockMvcRequestBuilders.get("/user/query") //路徑 .param("page", "10") //參數 .param("size", "12") .param("sort", "age,desc") .param("username", "xiaoming") .param("age", "18") .param("ageTo", "40") .param("other", "otherProperty") .contentType(MediaType.APPLICATION_JSON_UTF8)) .andExpect(MockMvcResultMatchers.status().isOk()) //狀態碼200 .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3))//長度為3,具體查看github的jsonPath項目 .andReturn().getResponse().getContentAsString(); System.err.println(result); } /** * 詳情 */ @Test public void whenGetInfoSuccess() throws Exception{ String result = mockMvc.perform(MockMvcRequestBuilders.get("/user/detail/1") .contentType(MediaType.APPLICATION_JSON_UTF8)) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$.username").value("tom")) .andReturn().getResponse().getContentAsString(); System.err.println(result); } /** * 詳情失敗 */ @Test public void whenGetInfoFail() throws Exception{ mockMvc.perform(MockMvcRequestBuilders.get("/user/detail/a") //匹配正則 .contentType(MediaType.APPLICATION_JSON_UTF8)) .andExpect(MockMvcResultMatchers.status().is4xxClientError()); } }
打印結果:使用UserDetailView視圖的會把密碼給打印出來