当前位置: 首页 > 知识库问答 >
问题:

如何在Spring中使用LocalDateTime RequestParam?我得到“无法将字符串转换为LocalDateTime”

芮化
2023-03-14

我使用Spring靴,并将杰克逊数据类型-jsr310与Maven一起包含:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.7.3</version>
</dependency>

当我尝试使用带有Java 8 Date/Time类型的RequestParam时,

@GetMapping("/test")
public Page<User> get(
    @RequestParam(value = "start", required = false)
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime start) {
//...
}

并使用此URL对其进行测试:

/test?start=2016-10-8T00:00

我得到以下错误:

{
  "timestamp": 1477528408379,
  "status": 400,
  "error": "Bad Request",
  "exception": "org.springframework.web.method.annotation.MethodArgumentTypeMismatchException",
  "message": "Failed to convert value of type [java.lang.String] to required type [java.time.LocalDateTime]; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam @org.springframework.format.annotation.DateTimeFormat java.time.LocalDateTime] for value '2016-10-8T00:00'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2016-10-8T00:00]",
  "path": "/test"
}

共有3个答案

方飞鸣
2023-03-14

我在这里找到了解决方法。

Spring/Spring Boot仅支持正文参数中的日期/日期-时间格式。

以下配置类在QUERY STRING(请求参数)中添加了对日期/日期时间的支持:

// 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);
    }
}

分别是:

// 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);
    }
}

即使您将多个请求参数绑定到某个类(@DateTimeFormat注释在这种情况下是无助的),它也可以工作:

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) {
// ...
廖弘量
2023-03-14

你做的每件事都是正确的:)。下面是一个例子,它准确地显示了你在做什么。只需使用@DateTimeFormat注释您的RequestParam即可。控制器中不需要特殊的GenericConversionService或手动转换。这篇博客文章是关于它的。

@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
    }
}

我猜你对格式有问题。在我的设置中,一切都很好。

颛孙霖
2023-03-14

TL;DR——您可以只使用< code>@RequestParam将它捕获为一个字符串,或者您还可以让Spring通过参数上的< code>@DateTimeFormat将该字符串解析为一个java日期/时间类。

< code>@RequestParam足以获取您在=符号后提供的日期,但是,它作为< code >字符串进入该方法。这就是它抛出强制转换异常的原因。

有几种方法可以实现这一点:

  1. 自己解析日期,将值作为字符串获取。
@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...
}
@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).
}
 类似资料:
  • 谁能告诉我为什么我会得到这个例外,我该如何解决这个问题? 谢谢!

  • 问题内容: 您如何将此String转换为gson.JsonArray? 这是我的代码: 这是将这个Collections字符串转换为JSonArray的方法吗? 问题答案: 要在JSON数组中包含字符串值,必须记住在Java程序中用反斜杠转义双引号。请参见下面的声明。 您在main()方法中的代码可以正常工作。以下只是对main()方法中的代码的微小修改。 最后,请记住在语句“ com.googl

  • 我将XML作为字符串传递给一个方法,并再次将其转换为XML来完成我的工作。 其正常工作正常,但当出现特殊字符时,如<代码> 我的XML字符串: 我的代码是: 错误: “=”是意外标记。预期标记为“;”。第1行,位置150。 完全错误为: 系统Xml。XmlException未由用户代码处理HResult=-2146232000消息=“=”是意外令牌。预期标记为“;”。第1行,位置150。源=系统。

  • 这是我的方法。 我正在尝试获取;放入我的

  • 我对旨在为我的类打印一个假设的新hashCode的方法有一个问题。我试图为每个对象创建一个hashcode,它将由我的类的两个String变量的hashcode组成。这是我的代码: 每当我删除“HashCodeToConvert”行并打印一个名为“PlateNumber”的字符串时,方法都能正常工作。从这一点上,我了解到将连接的hashcode转换为字符串是成功的。 每当我将“platenumbe

  • 我们可以使用StreamApi将上面的字符串转换为字符流吗?