Solución:
Hiciste todo correctamente :). A continuación, se muestra un ejemplo que muestra exactamente lo que está haciendo. Solo Anote su RequestParam con @DateTimeFormat
. No hay necesidad de especial GenericConversionService
o conversión manual en el controlador. Esta publicación de blog escribe sobre ello.
@RestController
@RequestMapping("/api/datetime/")
final class DateTimeController {
@RequestMapping(value = "datetime", method = RequestMethod.POST)
public void processDateTime(@RequestParam("datetime")
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime dateAndTime) {
//Do stuff
}
}
Supongo que tuvo un problema con el formato. En mi configuración, todo funciona bien.
TL; DR – puedes capturarlo como una cadena con solo @RequestParam
, o puede hacer que Spring también analice la cadena en una clase de fecha / hora de Java a través de @DateTimeFormat
en el parámetro también.
los @RequestParam
es suficiente para tomar la fecha que proporciona después del signo =, sin embargo, entra en el método como un String
. Es por eso que está lanzando la excepción de transmisión.
Hay algunas formas de lograrlo:
- analice la fecha usted mismo, tomando el valor como una cadena.
@GetMapping("/test")
public Page<User> get(@RequestParam(value="start", required = false) String start){
//Create a DateTimeFormatter with your required format:
DateTimeFormatter dateTimeFormat =
new DateTimeFormatter(DateTimeFormatter.BASIC_ISO_DATE);
//Next parse the date from the @RequestParam, specifying the TO type as
a TemporalQuery:
LocalDateTime date = dateTimeFormat.parse(start, LocalDateTime::from);
//Do the rest of your code...
}
- Aproveche la capacidad de Spring para analizar automáticamente y esperar formatos de fecha:
@GetMapping("/test")
public void processDateTime(@RequestParam("start")
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
LocalDateTime date) {
// The rest of your code (Spring already parsed the date).
}
Encontré una solución aquí.
Spring / Spring Boot solo admite el formato de fecha / fecha-hora en los parámetros BODY.
La siguiente clase de configuración agrega soporte para fecha / fecha-hora en QUERY STRING (parámetros de solicitud):
// Since Spring Framwork 5.0 & Java 8+
@Configuration
public class DateTimeFormatConfiguration implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
registrar.setUseIsoFormat(true);
registrar.registerFormatters(registry);
}
}
respectivamente:
// Until Spring Framwork 4.+
@Configuration
public class DateTimeFormatConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addFormatters(FormatterRegistry registry) {
DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
registrar.setUseIsoFormat(true);
registrar.registerFormatters(registry);
}
}
Funciona incluso si vincula varios parámetros de solicitud a alguna clase (@DateTimeFormat
anotación indefenso en este caso):
public class ReportRequest {
private LocalDate from;
private LocalDate to;
public LocalDate getFrom() {
return from;
}
public void setFrom(LocalDate from) {
this.from = from;
}
public LocalDate getTo() {
return to;
}
public void setTo(LocalDate to) {
this.to = to;
}
}
// ...
@GetMapping("/api/report")
public void getReport(ReportRequest request) {
// ...