Spring 用于 Post 请求和 Bean 验证的 MockMVC
Spring MockMVC for Post Request and Bean Validation
我有一个常见的问题要测试Post-Request with Bean Validation。
要求:ContentType 是 APPLICATION_FORM_URLENCODED 而不是 JSON
被测模型:
public class Message extends Auditable{
@Id
private long id;
private String messageText;
@NotNull
private Link link;
}
它如何在浏览器上正常工作:
我只是提交数据。在浏览器开发工具上,我看到,浏览器发送
仅适用于字段:messageText="my message" 和 link="1"
问题:在 MockMVC Post-Request 期间,我无法将参数值“1”转换为对象 Link。
this.mockMvc.perform(MockMvcRequestBuilders.post("/links/link/comments")
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
.param("link", "1")
.param("messageText", "hello message"))
.andDo(print())
.andExpect(status().is3xxRedirection());
}
我的 post-控制器上的处理程序
@PostMapping(value = "/link/message")
public String saveNewComment(@Valid Message message, BindingResult bindingResult, RedirectAttributes attributes) {
if(bindingResult.hasErrors()) {
model.addAttribute("newMessage", message);
return "link/submit";
}
}
BindingResult 抱怨 TypeMismatch 从 "String" 到 "Link"。
我如何传递一些 Marschal- 或 Converter-Object,使 BindingResult 能够将字符串值转换为适当的对象?
我不想在服务器端实现自己的验证器对象(它实现了验证器接口),因为在生产环境中它无需任何额外代码即可正常工作。
我已经通过小修复自行解决了这个问题。嵌套对象应使用 explizit field-name 进行参数化。而不是 param("link", "1") 它必须是 param("link.id", "1")
我有一个常见的问题要测试Post-Request with Bean Validation。
要求:ContentType 是 APPLICATION_FORM_URLENCODED 而不是 JSON
被测模型:
public class Message extends Auditable{
@Id
private long id;
private String messageText;
@NotNull
private Link link;
}
它如何在浏览器上正常工作: 我只是提交数据。在浏览器开发工具上,我看到,浏览器发送 仅适用于字段:messageText="my message" 和 link="1"
问题:在 MockMVC Post-Request 期间,我无法将参数值“1”转换为对象 Link。
this.mockMvc.perform(MockMvcRequestBuilders.post("/links/link/comments")
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
.param("link", "1")
.param("messageText", "hello message"))
.andDo(print())
.andExpect(status().is3xxRedirection());
}
我的 post-控制器上的处理程序
@PostMapping(value = "/link/message")
public String saveNewComment(@Valid Message message, BindingResult bindingResult, RedirectAttributes attributes) {
if(bindingResult.hasErrors()) {
model.addAttribute("newMessage", message);
return "link/submit";
}
}
BindingResult 抱怨 TypeMismatch 从 "String" 到 "Link"。
我如何传递一些 Marschal- 或 Converter-Object,使 BindingResult 能够将字符串值转换为适当的对象?
我不想在服务器端实现自己的验证器对象(它实现了验证器接口),因为在生产环境中它无需任何额外代码即可正常工作。
我已经通过小修复自行解决了这个问题。嵌套对象应使用 explizit field-name 进行参数化。而不是 param("link", "1") 它必须是 param("link.id", "1")