Java 如何使用Spring Boot在rest控制器上接受不同的日期格式?

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-

我已经实现了一个rest控制器方法,它在RequestBody参数处接收一个对象,这是一个简单的POJO(来自另一个项目的依赖项)

我收到的json是这样的:

{"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
,则无法更改属性的类型