Java 错误400:错误请求涉及JSON对象内的时间戳
我有一个Spring3MVC控制器,它有一个对象的@ModelAttribute参数 此对象包含许多属性,主要是字符串/数字。它有一个java.sql.Timestamp属性 我通过浏览器调用这个方法,将属性作为单独的查询字符串键/值对传递。当我没有为时间戳传递一个键/值对时,一切都正常工作,它会加载带有我所有属性的对象 但是,当我尝试发送一个Timestamp proeprty的值时,我立即得到一个错误400:请求错误 我知道我必须以特定的格式发送数据字符串,但我只使用JsonDeserializer,这样我就可以使用我想要的格式解析字符串。但是,当我在JsonDeserializer中设置断点时,它永远不会被命中。春天似乎忽略了它。我错过了什么 一些代码: 控制器:Java 错误400:错误请求涉及JSON对象内的时间戳,java,json,spring-mvc,Java,Json,Spring Mvc,我有一个Spring3MVC控制器,它有一个对象的@ModelAttribute参数 此对象包含许多属性,主要是字符串/数字。它有一个java.sql.Timestamp属性 我通过浏览器调用这个方法,将属性作为单独的查询字符串键/值对传递。当我没有为时间戳传递一个键/值对时,一切都正常工作,它会加载带有我所有属性的对象 但是,当我尝试发送一个Timestamp proeprty的值时,我立即得到一个错误400:请求错误 我知道我必须以特定的格式发送数据字符串,但我只使用JsonDeserial
@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