У меня есть форма WebFlux, использующая Thymeleaf, которая отправляет значение времени, которое преобразуется в Java LocalTime. Это прекрасно работает через пользовательский интерфейс, так как я заполняю и заполняю форму. Однако, когда я попытался проверить действие формы с помощью WebFlux WebTestClient
, я получил следующую ошибку:
Failed to convert property value of type 'org.springframework.http.codec.multipart.SynchronossPartHttpMessageReader$SynchronossPart' to required type 'java.time.LocalTime'
Мой тестовый код выглядит следующим образом:
@Test
public void addNewEntrySubmit() {
MultiValueMap<String, Object> formData = new LinkedMultiValueMap<>();
formData.add("id", "ghj45679");
formData.add("month", month);
formData.add("dateOfMonth", Integer.toString(21));
formData.add("day", "Tuesday");
formData.add("startTime", LocalTime.parse("09:00", DateTimeFormatter.ofPattern("HH:mm")));
formData.add("endTime", LocalTime.parse("17:00", DateTimeFormatter.ofPattern("HH:mm")));
formData.add("breakLength", LocalTime.parse("00:30", DateTimeFormatter.ofPattern("HH:mm")));
formData.add("onsite", Boolean.toString(false));
given(service.addTimeKeepingEntry(any())).willReturn(Mono.empty());
webTestClient.post().uri("/add-new-entry").contentType(MediaType.MULTIPART_FORM_DATA)
.body(BodyInserters.fromMultipartData(formData)).exchange().expectStatus().isSeeOther().expectHeader().valueEquals(HttpHeaders.LOCATION, "/");
}
Редактировать: Ниже приведен метод контроллера. Как отмечалось ранее, это работает через браузер, а не тестовый код.
@PostMapping("/add-new-entry")
public Mono<String> addNewEntrySubmit(@Valid TimeKeepingEntry timeKeepingEntry, BindingResult bindingResult, Model model) {
if (bindingResult.hasErrors()) {
System.out.println(bindingResult.getAllErrors());
model.addAttribute("metaTitle", "Add New Time Entry Validation");
model.addAttribute("timeKeepingEntry", timeKeepingEntry);
return Mono.just("add-entry");
}
timeKeepingEntry.setTotalHrs(Utils.calculateTotalHoursDay(timeKeepingEntry));
System.out.println(timeKeepingEntry);
return service.addTimeKeepingEntry(Flux.just(timeKeepingEntry)).log("Created Data").then(Mono.just("redirect:/")).log("Finished");
}
Я не уверен, что мне здесь не хватает или почему он не работает, нужно ли добавить еще один параметр в форме данных.
Редактировать. Я использую Spring Boot 2.0.5 и WebFlux 5.0.9