我使用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"
}
我在这里找到了解决方法。
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) {
// ...
你做的每件事都是正确的:)。下面是一个例子,它准确地显示了你在做什么。只需使用@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
}
}
我猜你对格式有问题。在我的设置中,一切都很好。
TL;DR——您可以只使用< code>@RequestParam将它捕获为一个字符串,或者您还可以让Spring通过参数上的< code>@DateTimeFormat将该字符串解析为一个java日期/时间类。
< code>@RequestParam足以获取您在=符号后提供的日期,但是,它作为< code >字符串进入该方法。这就是它抛出强制转换异常的原因。
有几种方法可以实现这一点:
@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将上面的字符串转换为字符流吗?