Создайте приложение для микро-сервиса с помощью jhipster.Одна из конечных точек принимает LocalDate в качестве параметра запроса.
При тестировании этой службы с использованием шлюза она работает нормально.Абсолютно никаких проблем.
Но я сделал интеграционный тест, и там он не будет работать:
2019-01-24 16: 46: 37.050 WARN 21145 --- [main] .wsmsDefaultHandlerExceptionResolver: Устранено исключение, вызванное выполнением обработчика: org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: не удалось преобразовать значение типа «java.lang.String» в требуемый тип «java.time.LocalDate»;вложенным исключением является org.springframework.core.convert.ConversionFailedException: не удалось преобразовать тип [java.lang.String] в тип [@ io.swagger.annotations.ApiParam @ javax.validation.Valid @ org.springframework.web.bind.annotation.RequestParam java.time.LocalDate] для значения '2019-01-01';вложенное исключение - java.lang.IllegalArgumentException: попытка разбора не удалась для значения [2019-01-24]
Контроллер сгенерирован, поскольку я сделал его «api-first».Вот определение параметра даты:
-
name: fromDate
in: query
description: "blablabla"
required: false
schema:
format: date
type: string
Вот как выглядит мой тест:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = FooBarServiceApp.class)
public class FooBarApiDelegateImplIntTest {
private MockMvc mockMvc;
@Autowired
FooBarApiController controller;
@Before
public void setup() {
this.mockMvc = MockMvcBuilders
.standaloneSetup(controller)
.build();
}
@Test
@Transactional
public void test() throws Exception {
LocalDate now = LocalDate.now();
mockMvc.perform(get("/api/fooBar").param("fromDate", "2019-01-01"))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE))
.andExpect(jsonPath("$").isArray())
.andExpect(jsonPath("$", hasSize(1)))
.andReturn();
}
}
FooBarController - это сгенерированный контроллер, и часть, которая объявляет конечную точку, выглядит следующим образом:
default ResponseEntity<List<FooBar>> getFooBar(@ApiParam(value = " blablabla") @Valid @RequestParam(value = "fromDate", required = false) LocalDate fromDate);
Если я добавлю DateTimeFormat к этому коду:
default ResponseEntity<List<FooBar>> getFooBar(@ApiParam(value = " blablabla") @Valid @RequestParam(value = "fromDate", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate fromDate);
Тогда мой тест работает отлично.Очевидно, что я не могу вручную изменить сгенерированный код, поэтому альтернатива, которую я вижу, состоит в том, чтобы объявить мой параметр как простую строку в API, а затем преобразовать его сам в FooBarApiDelegateImpl.
Но так как он работаетза пределами интеграционного теста я постоянно говорю себе, что в моем тесте должно быть какое-то объяснение, а также какой-то способ настройки преобразования даты.
Кто-нибудь?
Обновление: я понизил версию своего файлаот использования openApi 3 до openApi 2 (чванство).Такое же поведение, так что это не проблема.