Hey all, First off, I heart XStream. I just wanted to share a problem I had recently and how I solved it. It seems to me the solution is unintuitive and hard to find. This maybe isn't a bug, but at the very least I think it should be easier to do what I needed to do, or maybe his needs to be a FAQ or something.
So here's my story: I noticed my dates were not being converted the way I wanted. After much searching I found this: http://jira.codehaus.org/browse/XSTR-116 Ah hah! that's all I need to do! - first comment: that should be a FAQ or something. ISO8601 dates are pretty widely accepted as standard for XML, right? If they don't work automatically, it should be easy for people to figure out how to make them work, and I think the FAQ is the right place for that. So I installed Jodatime, registered my converter and thought I was done with it. But I wasn't. Unbeknownst to me, my persistence engine was converting my java.util.date objects to java.sql.timestamp objects.... sometimes. One solution, of course, was to manually change that, since I was using different objects for persistence and XML conversion, but that seemed error-prone. Not a good solution. SO I thought the right was would be to make XStream handle this. The problem was here: public class ISO8601DateConverter extends ISO8601GregorianCalendarConverter { public boolean canConvert(Class type) { return type.equals(Date.class); } ... } The date converter was only handling java.util.Date classes and not subclasses. Was that intentional? I don't know, but my solution was to do this: public static ISO8601DateConverter DATE_CONVERTER = new ISO8601DateConverter() { @Override public boolean canConvert(Class type) { return Date.class.isAssignableFrom(type); } }; That worked! horray! Now java.util.Date AND ALL SUBCLASSES are converted to ISO8601 dates, like I wanted. - Second Comment/question: Is this a bug, or was that intentional? If it was intentional, is my subclassed cade safe? Now here's the problem I don't really understand: the timestamp objects still converted like this: <cTime class="sql-timestamp">2012-03-17T20:44:00.490Z</cTime> So the date/time format is right, but the class annotation confuses XStream when trying to deserialize this. The solution, which was counterintuitive to me, was this: XStream xstream = super.createXstream(mediaType); xstream.addDefaultImplementation(java.sql.Date.class,java.util.Date.class); xstream.addDefaultImplementation(java.sql.Timestamp.class,java.util.Date.class); xstream.addDefaultImplementation(java.sql.Time.class,java.util.Date.class); xstream.registerConverter(DATE_CONVERTER); That gets rid of the pesky annotation, although I suppose some other subclass could come along and mess things up. - Third comment/question: Is this the best way? Am I missing something? If this is the best way, I think there should be a better way as this is unintuitive and potentially error prone if another date subclass comes along. Okay, thanks! bjorn ----------------------------- Bjorn Roche http://www.xonami.com Audio Collaboration http://blog.bjornroche.com
