用于发布请求和Bean验证的Spring MockMVC

时间:2019-07-03 12:19:02

标签: spring-mvc http-post bean-validation spring-test-mvc

我在使用Bean验证测试后请求时遇到一个常见问题。

要求:ContentType为APPLICATION_FORM_URLENCODED,而非JSON

正在测试的模型:

public class Message extends Auditable{

    @Id
    private long id;    
    private String messageText;
    @NotNull
    private Link link;
}

它如何在浏览器上正常工作: 我只是提交数据。在浏览器开发工具上,我看到该浏览器发送 仅限于以下字段:messageText =“我的消息”和link =“ 1”

问题:在MockMVC发布请求期间,我无法将参数值“ 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());

}

我在控制器上的后处理程序

@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从“字符串”到“链接”。

如何传递一些Marschal对象或Converter-Object,使BindingResult将字符串值转换为适当的对象?

我不想在服务器端自己的验证器对象(实现验证器接口)上实现,因为在生产中它可以正常工作而无需任何其他代码。

1 个答案:

答案 0 :(得分:0)

我已经通过较小的解决方案自行解决了此问题。嵌套对象应使用explicit字段名进行参数化。代替param(“ link”,“ 1”),它必须是param(“ link.id”,“ 1”)