本文是对之前同学写的一篇文章的补充,原文为:http://lindasoft.com/view/article/details?articleId=264
本文主要介绍在@ModelAttribute 和@RequestBody 的区别。
controller如下:
@PostMapping("/insert")
public JsonResult insert(@ModelAttribute RiskPlace riskPlace){
JsonResult jsonResult = new JsonResult();
log.info(riskPlace.toString());
return jsonResult;
}
Junit中的测试代码如下:
@Test
public void insert() {
//使用easyRandom 自动创建一个对象
EasyRandom easyRandom = new EasyRandom();
RiskPlace riskPlace = easyRandom.nextObject(RiskPlace.class);
String param = JSONObject.toJSONString(riskPlace);
MultiValueMap<String, String> paramMap = (MultiValueMap<String, String>) JSON.parse(param);
try {
mockMvc.perform(MockMvcRequestBuilders.post("/admin/riskPlace/insert")
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.content(param))
.andDo(print())
.andExpect(status().isOk()).andReturn().getResponse().getContentAsString();
} catch (Exception e) {
e.printStackTrace();
}
}
上面代码执行时,发现controller中 RiskPlace 并不能获取到参数,这个是为什么呢?
这里的@ModelAttribute是关键,@ModelAttribute 用于接收key,value形式参数。
而 @RequestBody 用于接受JSON对象,且@RequestBody用于post请求,不能用于get请求。
所以Controller修改为用@RequestBody接收参数即可
@PostMapping("/insert")
public JsonResult insert(@RequestBody RiskPlace riskPlace){
JsonResult jsonResult = new JsonResult();
log.info(riskPalce.toString());
return jsonResult;
}
若是Controller中使用@ModelAttribute时Mock怎么传值呢? 如下使用.param() / .params()即可。
@Test
public void insert() {
MockHttpServletRequestBuilder mockHttpServletRequestBuilder = null;
try {
mockHttpServletRequestBuilder = post( "/admin/riskPlace/insert")
.contentType(MediaType.APPLICATION_JSON)
.param("placeName","教室");
} catch (Exception e) {
e.printStackTrace();
}
try {
mockMvc.perform(mockHttpServletRequestBuilder).andDo(print());
} catch (Exception e) {
e.printStackTrace();
}
}
{{ cmt.username }}
{{ cmt.content }}
{{ cmt.commentDate | formatDate('YYYY.MM.DD hh:mm') }}