Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.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/json/13.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 错误400:错误请求涉及JSON对象内的时间戳_Java_Json_Spring Mvc - Fatal编程技术网

Java 错误400:错误请求涉及JSON对象内的时间戳

Java 错误400:错误请求涉及JSON对象内的时间戳,java,json,spring-mvc,Java,Json,Spring Mvc,我有一个Spring3MVC控制器,它有一个对象的@ModelAttribute参数 此对象包含许多属性,主要是字符串/数字。它有一个java.sql.Timestamp属性 我通过浏览器调用这个方法,将属性作为单独的查询字符串键/值对传递。当我没有为时间戳传递一个键/值对时,一切都正常工作,它会加载带有我所有属性的对象 但是,当我尝试发送一个Timestamp proeprty的值时,我立即得到一个错误400:请求错误 我知道我必须以特定的格式发送数据字符串,但我只使用JsonDeserial

我有一个Spring3MVC控制器,它有一个对象的@ModelAttribute参数

此对象包含许多属性,主要是字符串/数字。它有一个java.sql.Timestamp属性

我通过浏览器调用这个方法,将属性作为单独的查询字符串键/值对传递。当我没有为时间戳传递一个键/值对时,一切都正常工作,它会加载带有我所有属性的对象

但是,当我尝试发送一个Timestamp proeprty的值时,我立即得到一个错误400:请求错误

我知道我必须以特定的格式发送数据字符串,但我只使用JsonDeserializer,这样我就可以使用我想要的格式解析字符串。但是,当我在JsonDeserializer中设置断点时,它永远不会被命中。春天似乎忽略了它。我错过了什么

一些代码:

控制器:

@RequestMapping(headers = "Accept=application/json;charset=utf-8", value = "/doSomething", method = RequestMethod.GET)
    @ResponseBody
    public ReturnObject doSomething(@ModelAttribute MyObject obj, HttpServletRequest request) throws Exception {    
    //blah blah
}
MyObject:

public class MyObject {
    private Integer someNumber;
    private String someString;
    @JsonDeserialize(using=ShortDateDeserializer.class)
    private Timestamp someTimestamp;
    // getter/setters like usual....
}
ShortDateDeserializer:

public class ShortDateDeserializer extends JsonDeserializer<Timestamp> {

    Logger logger = Logger.getLogger(ShortDateDeserializer.class);

    @Override
    public Timestamp deserialize(JsonParser parser, DeserializationContext ctx) throws IOException, JsonProcessingException {

        try {
            String rawDate = parser.getText();

            SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
            return new Timestamp(sdf.parse(rawDate).getTime());
        } catch (Exception e) {
            logger.error("Failed to parse date: "+parser.getText());
            throw new IOException("Failed to parse date: "+parser.getText());
        }
    }
}
很好

当我还尝试设置timstamp的值时:

localhost/doSomething?someNumber=1&someString=xyz&someTimestamp=09/15/2013
我立即收到一个错误400:请求错误


为了让spring在填充MyObject时使用我的自定义时间戳解析代码,我错过了什么?

使用@RequestBody而不是@ModelAttribute。

在调试级别记录您的请求,并将其包含在问题中。Log package
org.springframework.web
尝试将'@RequestBody'替换为'@modeldattribute'@luizcarlosfx:是的,这确实解决了它!事实上,我甚至在这里使用ModelAttribute都是一个错误,我应该使用RequestBody,因为这是一篇包含大量数据的文章。谢谢你抓住了!虽然我仍然想知道为什么ModelAttribute不能使用反序列化程序,因为这似乎仍然是一些GET在不使用RequestBody的情况下需要的功能…我认为您不能将反序列化程序与@ModelAttribute和GET方法一起使用,因为GET方法不能有您不能使用的bodyjson@luizcarlosfx谢谢你的解释。你介意把你最初的评论作为答案吗?这样我就可以把它作为这个问题的答案了?谢谢
localhost/doSomething?someNumber=1&someString=xyz&someTimestamp=09/15/2013