Java 将日期作为JSON传递给Spring MVC和Jackson

Java 将日期作为JSON传递给Spring MVC和Jackson,java,json,spring,spring-mvc,jackson,Java,Json,Spring,Spring Mvc,Jackson,我有一个带有java.util.Date字段的类,我希望将该字段从客户端传递给Spring控制器。每当我发出请求时,控制器返回HTTP 415。我已经尝试添加一个自定义序列化程序,正如在我能找到的许多其他问题中看到的那样。自定义序列化程序可以工作,因为检索资源的控制器以自定义格式检索资源,但控制器不会确认JSON。如果我完全删除了日期,控制器就会工作,因此我知道问题出在该字段上 理想情况下,我希望以默认的长表示形式接收它们,但我无法让控制器接受这两种格式 控制器 @RequestMapping(

我有一个带有java.util.Date字段的类,我希望将该字段从客户端传递给Spring控制器。每当我发出请求时,控制器返回HTTP 415。我已经尝试添加一个自定义序列化程序,正如在我能找到的许多其他问题中看到的那样。自定义序列化程序可以工作,因为检索资源的控制器以自定义格式检索资源,但控制器不会确认JSON。如果我完全删除了日期,控制器就会工作,因此我知道问题出在该字段上

理想情况下,我希望以默认的长表示形式接收它们,但我无法让控制器接受这两种格式

控制器

@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<String> addEvent(ModelMap model, @RequestBody Event event)
{
    eventService.saveEvent(event);
    return new ResponseEntity<String>(HttpStatus.CREATED);
}
序列化程序

private static final SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy");

@Override
public void serialize(Date date, JsonGenerator gen, SerializerProvider provider)
        throws IOException, JsonProcessingException {

    String formattedDate = dateFormat.format(date);

    gen.writeString(formattedDate);
}
以及我的GET控制器检索到的JSON(当我可以让它工作时,我会更精确)


不使用字符串,只需从jsp传递date对象,如下所示

var date = new Date();
var formData = {'date':date};

在dto中,使变量类型为java.util.Date.

而不是字符串,只需从jsp传递Date对象,如下所示

var date = new Date();
var formData = {'date':date};

在dto中,使变量的类型为java.util.Date。

您有一个序列化程序,但没有反序列化程序,因此它只能以一种方式工作

您还需要:

 @JsonDeserialize(using = DateDeserializer.class)
(带有使用相同日期格式的DateDeserializer)


为什么两者都没有单一的接口对我来说是个谜:-)

您有一个序列化程序,但没有反序列化程序,所以它只能以一种方式工作

您还需要:

 @JsonDeserialize(using = DateDeserializer.class)
(带有使用相同日期格式的DateDeserializer)


为什么两者都没有一个接口对我来说是个谜:-)

你的调试器在serialize方法中说了什么?org.springframework.web.HttpMediaTypeNotSupportedException:控制器正在抛出不支持的内容类型“application/json”。我完全弄糊涂了,因为如果没有日期,它会接受json输入。您不应该在静态final变量中使用SimpleDataFormat,如上所示,因为SimpleDataFormat不是线程安全的。相反,为每个序列化调用实例化一个新的SimpleDataFormat。调试器在serialize方法中说了什么?org.springframework.web.HttpMediaTypeNotSupportedException:控制器正在抛出不支持的内容类型“application/json”。我完全弄糊涂了,因为如果没有日期,它会接受json输入。您不应该在静态final变量中使用SimpleDataFormat,如上所示,因为SimpleDataFormat不是线程安全的。相反,为每个序列化调用实例化一个新的SimpleDataFormat。没有jsp,我将json从一个非web应用程序传递到spring mvc应用程序。您可以将它放在任何进行json调用的地方。没有jsp,我正在将json从一个非web应用程序传递到spring mvc应用程序。您可以在任何地方调用json。这不是直接的问题,因为我在使用java.util.Date字段的默认(反)序列化程序时仍然存在问题。我在测试反序列化时发现了问题。我的序列化是正确的,但是我有一个重复的日期设置器。一个接受一个日期对象,另一个接受一个长的日期对象。删除重复设置器修复了该问题。实际上,我不再需要序列化器或反序列化器,因为我想一直使用默认的序列化器,但这在将来会有很大帮助。这不是直接的问题,因为我在使用java.util.Date字段的默认(反)序列化器时仍然存在问题。我在测试反序列化时发现了问题。我的序列化是正确的,但是我有一个重复的日期设置器。一个接受一个日期对象,另一个接受一个长的日期对象。删除重复设置器修复了该问题。我实际上不再需要序列化器或反序列化器,因为我想一直使用默认的序列化器,但这在将来会有很大帮助。