Java 客户端发送的请求使用@DateTimeFormat在语法上不正确
我有一个JSON格式的字符串,通过HTTP-PUT发送到带有SpringMVC和Hibernate的服务器Java 客户端发送的请求使用@DateTimeFormat在语法上不正确,java,mysql,json,spring,hibernate,Java,Mysql,Json,Spring,Hibernate,我有一个JSON格式的字符串,通过HTTP-PUT发送到带有SpringMVC和Hibernate的服务器 控制器: @RequestMapping(value = "/", method = RequestMethod.PUT) public ResponseEntity<Map<String, Object>> myTest( @RequestHeader("a") String a, @RequestBody MyTestClass
控制器
:
@RequestMapping(value = "/", method = RequestMethod.PUT)
public ResponseEntity<Map<String, Object>> myTest(
@RequestHeader("a") String a,
@RequestBody MyTestClass b) { … }
test
是一个java.util.Date(MySQL->Date),我对POJO的注释如下:
@Column(name = "TEST")
@DateTimeFormat(pattern = "MM/yy")
private Date test;
因此,test
的格式应为月/年。但我在Firefox RESTClient上试过,我总是
客户端发送的请求语法不正确。
删除测试
,一切正常并按预期工作
看来,使用
@DateTimeFormat(pattern=“MM/yy”)
有什么问题吗?因为您将RequestBody
与应用程序/json
内容类型一起使用,Spring将使用其映射Jackson2httpMessageConverter
将json转换为您类型的对象。但是,您提供的日期字符串,11/14
与任何预先配置的日期模式都不匹配,因此无法正确解析。MappingJackson2HttpMessageConverter
,或者更具体地说,执行该任务的ObjectMapper
,对Spring注释@DateTimeFormat
一无所知
您需要告诉Jackson您要使用哪种日期模式。您可以使用自定义日期反序列化器来执行此操作
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);
}
}
}
如果将url编码的表单参数与
@modeldattribute
一起使用,则可以使用@DateTimeFormat
。Spring注册了一些转换器,这些转换器可以将请求参数中的字符串值转换为Date
对象 因为您正在将RequestBody
与应用程序/json
内容类型一起使用,Spring将使用其MappingJackson2HttpMessageConverter
将json转换为您类型的对象。但是,您提供的日期字符串,11/14
与任何预先配置的日期模式都不匹配,因此无法正确解析。MappingJackson2HttpMessageConverter
,或者更具体地说,执行该任务的ObjectMapper
,对Spring注释@DateTimeFormat
一无所知
您需要告诉Jackson您要使用哪种日期模式。您可以使用自定义日期反序列化器来执行此操作
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);
}
}
}
如果将url编码的表单参数与@modeldattribute
一起使用,则可以使用@DateTimeFormat
。Spring注册了一些转换器,这些转换器可以将请求参数中的字符串值转换为Date
对象
@JsonDeserialize(using = CustomDateDeserializer.class)
private Date test;