Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 客户端发送的请求使用@DateTimeFormat在语法上不正确_Java_Mysql_Json_Spring_Hibernate - Fatal编程技术网

Java 客户端发送的请求使用@DateTimeFormat在语法上不正确

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

我有一个JSON格式的字符串,通过HTTP-PUT发送到带有SpringMVC和Hibernate的服务器

控制器

@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;