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

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

唐高朗
2023-03-14

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

public class SimplePOJO {
   private Date productionDate;
   private String description;
   //getters and setters
}

我收到的json是这样的:

{"description":"something","productionDate":"10/03/2020"}

当我尝试调用rest服务时,我得到错误:

2020-07-11 15:23:09.274警告3008---[nio-8441-exec-2].w.s.m.s.defaultHandlerExceptionResolver:已解析[org.springframework.http.converter.httpmessageNotreadableException:JSON解析错误:无法从字符串“10/03/2020”反序列化java.util.Date类型的值:无效表示形式(错误:无法解析日期值“10/03/2020”:无法解析日期“10/03/2020”:与任何标准形式(“YYYY-MM-DD't'hh:mm:ss.ssx”、“嵌套异常为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.SSX”,“YYYY-MM-DD't'HH:MM:SS.SSS”,“EEE,dd MMM yyyy HH:MM:SS.SSS”)不兼容)

不幸的是,在SimplePoJO的productionDate字段中添加JsonFormat注释是不可能的。在我的服务中,是否有其他方式可以接受“日期/月/日”格式的日期?

谢谢!

共有1个答案

太叔飞翰
2023-03-14

如果没有办法使用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);
    }
  }
}

并将上面的一个包含到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));
  }
}

现在,您可以使用虚拟端点对其进行测试

@PostMapping("/test")
public ResponseEntity<Boolean> test(@RequestBody SimplePOJO simplePOJO) {
    return ResponseEntity.ok(true);
}

小心,因为这是一个全局date反序列化程序,也就是说,您必须在CustomJSONdateDeserializer中管理所有允许的格式

 类似资料:
  • 我在html页面中使用日期选择器,如下所示: HTML 日期选择控制器 主控制器 提交网页时,我会在主窗体控制器中检索日期,但格式与日期选择器弹出窗口中显示的格式不同。选择后显示的格式为“2014年3月26日”。但是,在我的控制器中,我得到:2014年3月26日星期四00:00:00 GMT 0000(GMT标准时间) 请问,如何在控制器中获得显示的日期格式,而不是“2014年3月26日星期四00

  • 我有多达10个方法在一个控制器,他们应该有相同的名称和逻辑,但不同的头。请求路径前缀可能不同。 如何简化REST控制器,而不是创建两个不同的控制器,使用相同的方法和相同的逻辑? 我尝试了几个例子来创建一个控制器,该控制器具有两个不同的接口,方法相同,但映射不同。 控制器仅与第一个接口映射。因此工作正常,但-获取错误代码。这意味着Java Spring-Boot没有这样的功能。需要更多的点子。 用开

  • 我得到了一个日期字段格式为的对象,我将其映射到一个对象中,如下所示: 现在我需要将这个对象作为json响应发送,但我需要它采用不同的格式: 如果我更改字段,反序列化失败: 如何使用不同的模式进行序列化

  • 问题内容: 我在移动设备上使用本地数据库,在我的数据库中,我的date字段具有column name 。我的列值是这种格式,我想获取给定日期的数据。我在下面的数据库列和值中尝试过的确切查询是什么 ** RN_CREATE_DATE 2012-07-27 11:04:34 2012-05-28 10:04:34 2012-07-22 09:04:34 ** 但没有找到结果,请帮我解决这个问题。 问题

  • 当我跑的时候 控制台启动,我看到,但我无法键入它。我哪里出错了?