У меня общая проблема при тестировании пост-запроса с проверкой бина.
Требования : ContentType имеет значение APPLICATION_FORM_URLENCODED, а НЕ JSON
Тестируемая модель:
public class Message extends Auditable{
@Id
private long id;
private String messageText;
@NotNull
private Link link;
}
Как это работает в браузере:
Я просто отправляю данные. В браузере Dev-Tools я вижу, что браузер отправляет
только для полей: messageText = "мое сообщение" и ссылка = "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 от «String» до «Link».
Как я могу передать какой-то объект Marschal или Converter, который позволяет BindingResult преобразовать строковое значение в соответствующий объект?
Я не хочу реализовывать на стороне сервера собственный объект-валидатор (который реализует интерфейс валидатора), потому что на производстве он работает правильно без какого-либо дополнительного кода.