我正在使用xStream来获取一些JSON。多年来我一直广泛使用xstream。不过这个问题让我很难过。
我收到以下ConversionException ...
com.thoughtworks.xstream.converters.ConversionException: For input string: ".232017E.232017E44"
---- Debugging information ----
message : For input string: ".232017E.232017E44"
cause-exception : java.lang.NumberFormatException
cause-message : For input string: ".232017E.232017E44"
class : java.sql.Timestamp
required-type : java.sql.Timestamp
converter-type : com.etepstudios.xstream.XStreamTimestampConverter
line number : -1
class[1] : com.pbp.bookacall.dataobjects.AppleReceipt
converter-type[1] : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
class[2] : com.pbp.bookacall.dataobjects.AppleReceiptCollection
version : 1.4.10
-------------------------------
at com.etepstudios.xstream.XStreamTimestampConverter.unmarshal(XStreamTimestampConverter.java:87)
在我的XStreamTimestampConverter类中,我打印出试图转换的值。结果证明是以下内容......
XStreamTimestampConverter value = 2017-08-05 23:44:23.GMT
这是我的转换器中的unmarshal功能...
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context)
{
Timestamp theTimestamp;
Date theDate;
String value = reader.getValue ();
try
{
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.Z");
theDate = formatter.parse(value);
theTimestamp = new Timestamp (theDate.getTime());
}
catch (Exception e)
{
System.out.println ("XStreamTimestampConverter value = " + value);
throw new ConversionException(e.getMessage(), e);
}
return theTimestamp;
}
知道这个奇怪的字符串来自哪里?它在我的JSON中不存在。 xstream是否有一些奇数。[num] E. [num] E [num]表示什么?每次运行时,这些数字都会发生变化。我也得到一个For输入字符串:“”。然而,价值与上面的相似。这就像它在某个地方随机获得奇数值。
数据源来自Apple的In-App Purchase / VerifyReceipt网络电话。系统工作一段时间很好,但其他人则没有。同样重要的是要注意,在这种情况下,它使用此转换器解析了100个其他日期/时间戳字符串。它只是让人感到困惑。也许是由于数据的大小?
答案 0 :(得分:0)
所以我弄清楚这里发生了什么。上面的unmarshal函数并不像我在代码中那样......
SimpleDateFormat格式化程序实际上是在类中而不是在unmarshal方法中设置的。因此,如果Xstream持有我的转换器的实例并且跨多个线程调用unmarshal,那么格式化程序可能会因为它是同一个对象而感到困惑。
这是我唯一的猜测,因为将格式化程序初始化移动到方法中解决了这个问题。我会说SimpleDateFormatter不是线程安全的吗?
只是数据的纯粹性以及同时被调用的次数暴露了这个问题。如果发生这种情况,只需给别人一个提示。