我有一个JSON格式的字符串,我用HTTP-PUT发送到带有Spring MVC和Hibernate的服务器。
Controller
:
@RequestMapping(value = "/", method = RequestMethod.PUT)
public ResponseEntity<Map<String, Object>> myTest(
@RequestHeader("a") String a,
@RequestBody MyTestClass b) { … }
JSON
:
{
"number":"123",
"test":"11/14"
}
test
是java.util.Date(MySQL - &gt; date),我注释了这样的POJO:
@Column(name = "TEST")
@DateTimeFormat(pattern = "MM/yy")
private Date test;
因此test
应格式化为月/年。但我尝试使用Firefox RESTClient,我总是得到它
The request sent by the client was syntactically incorrect.
正在删除test
,一切正常并按预期工作。
所以看来,@DateTimeFormat(pattern = "MM/yy")
有问题吗?
答案 0 :(得分:5)
由于您使用的RequestBody
内容类型为application/json
,因此Spring会使用其MappingJackson2HttpMessageConverter
将您的JSON转换为您的类型的对象。但是,您提供的日期字符串11/14
与任何预配置的日期模式都不匹配,因此无法正确解析它。 MappingJackson2HttpMessageConverter
,或更具体地说,ObjectMapper
执行此任务,对{注释@DateTimeFormat
没有任何了解。
您需要告诉杰克逊您想要使用哪种日期模式。您可以使用自定义日期反序列化器
执行此操作public class CustomDateDeserializer extends JsonDeserializer<Date> {
@Override
public Date deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
SimpleDateFormat format = new SimpleDateFormat("MM/yy");
String date = jp.getText();
try {
return format.parse(date);
} catch (ParseException e) {
throw new JsonParseException(e);
}
}
}
然后简单地注释你的领域,以便杰克逊知道如何反序列化它。
@JsonDeserialize(using = CustomDateDeserializer.class)
private Date test;
如果您使用带有@DateTimeFormat
的网址编码表单参数,则可以使用@ModelAttribute
。 Spring注册了一些可以将String值从请求参数转换为Date
对象的转换器。 This is described in the deocumentation.