Java 如何使用Spring Boot在rest控制器上接受不同的日期格式?
我已经实现了一个rest控制器方法,它在RequestBody参数处接收一个对象,这是一个简单的POJO(来自另一个项目的依赖项) 我收到的json是这样的:Java 如何使用Spring Boot在rest控制器上接受不同的日期格式?,java,spring,rest,date,jackson,Java,Spring,Rest,Date,Jackson,我已经实现了一个rest控制器方法,它在RequestBody参数处接收一个对象,这是一个简单的POJO(来自另一个项目的依赖项) 我收到的json是这样的: {"description":"something","productionDate":"10/03/2020"} 当我尝试调用rest服务时,出现错误: 2020-07-11 15:23:09.274 WARN 3008---[nio-8441-exec-
{"description":"something","productionDate":"10/03/2020"}
当我尝试调用rest服务时,出现错误:
2020-07-11 15:23:09.274 WARN 3008---[nio-8441-exec-2].w.s.m.s.DefaultHandlerExceptionResolver:已解析[org.springframework.http.converter.httpMessageEndableException:JSON解析错误:无法从字符串“10/03/2020”反序列化类型java.util.Date
的值:无效表示(错误:未能分析日期值“10/03/2020”:无法分析日期“10/03/2020”:与任何标准格式(“yyyy-MM-dd'HH:MM:ss.SSSX”、“YY-MM-dd'T'HH:MM:ss.SSS”、“EEE,dd-MM-yyyy-HH:MM:ss-zzz”、“yyyy-MM-dd”)不兼容);嵌套异常为com.fasterxml.jackson.databind.exc.InvalidFormatException:无法从字符串“10/03/2020”反序列化类型为java.util.Date
的值:不是有效的表示形式(错误:未能解析日期值“10/03/2020”:无法解析日期“10/03/2020”:与任何标准格式(“yyyy-MM-dd'T'HH:MM:ss.SSSX”)不兼容,“yyyy-MM-dd'T'HH:MM:ss.SSS”、“EEE,dd-MM-MM-yyyy-HH:MM:ss-zzz”、“yyyy-MM-dd”))
遗憾的是,无法在SimplePOJO的productionDate字段中添加JsonFormat注释。在我的服务中是否有其他方法接受格式为“dd/MM/yyyy”的日期
谢谢!如果无法使用
JsonFormat
注释,您应该包含您自己的“全局注释”。以下代码对我适用:
public class CustomJsonDateDeserializer extends JsonDeserializer<Date> {
@Override
public Date deserialize(JsonParser jsonParser,
DeserializationContext deserializationContext)
throws IOException, JsonProcessingException {
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
String date = jsonParser.getText();
try {
return format.parse(date);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
public类CustomJsonDateDeserializer扩展了JsonDeserializer{
@凌驾
公共日期反序列化(JsonParser JsonParser,
反序列化上下文(反序列化上下文)
抛出IOException、JsonProcessingException{
SimpleDataFormat格式=新的SimpleDataFormat(“dd/MM/yyyy”);
String date=jsonParser.getText();
试一试{
返回格式.parse(日期);
}捕获(解析异常){
抛出新的运行时异常(e);
}
}
}
在Web配置中包含上述内容,在本例中,我使用MVC在Spring boot 2上进行了测试:
@Configuration
@EnableWebMvc
public class WebConfiguration implements WebMvcConfigurer {
...
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
JavaTimeModule module = new JavaTimeModule();
module.addDeserializer(Date.class, new CustomJsonDateDeserializer());
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);
// Add converter at the first one to use
converters.add(0, new MappingJackson2HttpMessageConverter(mapper));
}
}
@配置
@EnableWebMvc
公共类WebConfiguration实现WebMVCConfiguer{
...
@凌驾
public void configureMessageConverters(List如果无法使用JsonFormat
注释,则应包含您自己的“全局注释”。以下代码适用于我:
public class CustomJsonDateDeserializer extends JsonDeserializer<Date> {
@Override
public Date deserialize(JsonParser jsonParser,
DeserializationContext deserializationContext)
throws IOException, JsonProcessingException {
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
String date = jsonParser.getText();
try {
return format.parse(date);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
public类CustomJsonDateDeserializer扩展了JsonDeserializer{
@凌驾
公共日期反序列化(JsonParser JsonParser,
反序列化上下文(反序列化上下文)
抛出IOException、JsonProcessingException{
SimpleDataFormat格式=新的SimpleDataFormat(“dd/MM/yyyy”);
String date=jsonParser.getText();
试一试{
返回格式.parse(日期);
}捕获(解析异常){
抛出新的运行时异常(e);
}
}
}
在Web配置中包含上述内容,在本例中,我使用MVC在Spring boot 2上进行了测试:
@Configuration
@EnableWebMvc
public class WebConfiguration implements WebMvcConfigurer {
...
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
JavaTimeModule module = new JavaTimeModule();
module.addDeserializer(Date.class, new CustomJsonDateDeserializer());
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);
// Add converter at the first one to use
converters.add(0, new MappingJackson2HttpMessageConverter(mapper));
}
}
@配置
@EnableWebMvc
公共类WebConfiguration实现WebMVCConfiguer{
...
@凌驾
public void configureMessageConverters(List您可以在POJO中注释日期属性。这样,它接受您正在发送的格式dd/MM/YYYY,并将能够将此类字符串反序列化到日期
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/YYYY")
private Date productionDate
您可以在POJO中注释日期属性。这样,它接受您正在发送的格式dd/MM/YYYY,并将能够将此类字符串反序列化到日期
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/YYYY")
private Date productionDate
这是否回答了您的问题?我建议您不要使用Date
。该类设计糟糕,而且很早就过时了。而是使用LocalDate
from。是的,同意您的意见,但是我猜如果她不能包含@JsonFormat
,则无法更改属性的类型。这是否回答了您的问题?我建议您不要使用Date
。该类设计糟糕且过时已久。请使用LocalDate
from。是的,同意您的意见,但是我猜如果她不能包含@JsonFormat
,则无法更改属性的类型