版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}
}
@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;
}
}