发布于2024-11-23 22:01 阅读(58) 评论(0) 点赞(14) 收藏(2)
我发现了错误http://jira.codehaus.org/browse/JACKSON-288,但是它说这个错误应该在 1.6.2 版本中修复。
我参考了很多线程,例如,
Jersey JSON 和 Date
如何通过 xml 将 Date(ActionScript 3)转换为 java.util.Date?
我尝试了 1.12、1.14、1.17.1 版本,但都无法运行。
@XmlRootElement(name="info")
@XmlAccessorType(XmlAccessType.NONE)
public class InfoVO {
private int infoId;
@XmlElement
@XmlJavaTypeAdapter(DateAdapter.class)
private Date createTime;
//...get/set
}
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.ws.rs.WebApplicationException;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class DateAdapter extends XmlAdapter<String, Date> {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public String marshal(Date v) {
return dateFormat.format(v);
}
@Override
public Date unmarshal(String v) {
try {
return dateFormat.parse(v);
} catch (ParseException e) {
throw new WebApplicationException();
}
}
}
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
</dependency>
但是 DateAdapter 根本无法调用,并且出现异常,
2013-06-12 11:11:13.363:WARN::/xa/info/save/12121:org.codehaus.jackson.map.JsonMappingException:无法从字符串值“2013-06-08 08:00:00”构造 java.util.Date 实例:不是有效表示(错误:无法解析日期“2013-06-08 08:00:00”:与任何标准形式不兼容(“yyyy-MM-dd'T'HH:mm:ss.SSSZ”,“yyyy-MM-dd'T'HH:mm:ss.SSS'Z'”,“EEE,dd MMM yyyy HH:mm:ss zzz”,“yyyy-MM-dd”))| 在 [来源:java.io.StringReader@b0ff5e1;行:8,列:23](通过引用链:com.xchange.me.vo.InfoVO["createTime"])
我找到了根本原因,因为我添加了一个自定义的 MessageBodyReader,
@Provider
@Consumes("application/json")
public class CustomJsonReader<T> implements MessageBodyReader<T> {
@Override
public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return true;
}
@Override
public T readFrom(Class<T> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders,
InputStream entityStream) throws IOException, WebApplicationException {
/*
* Copy the input stream to String. Do this however you like. Here I use
* Commons IOUtils.
*/
StringWriter writer = new StringWriter();
IOUtils.copy(entityStream, writer, "UTF-8");
String json = writer.toString();
/*
* if the input stream is expected to be deserialized into a String,
* then just cast it
*/
if (String.class == genericType)
return type.cast(json);
/*
* Otherwise, deserialize the JSON into a POJO type. You can use
* whatever JSON library you want, here's a simply example using GSON.
*/
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.readValue(json, type);
}
}
所以当收到 json 数据时,总是进入 readFrom 方法,然后在 return objectMapper.readValue(json, type); 行中抛出异常。
所以我认为根本原因是 ObjectMapper.readValue 忽略了注释 @XmlJavaTypeAdapter
作者:黑洞官方问答小能手
链接:http://www.javaheidong.com/blog/article/693961/955e7bd534cb06d08371/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!