Search code examples
javaxstream

Xstream ignoring registered converters


I am running a webapp using spring and i use xstream as my serializing tool. I have defined a marsheller to include custom converters, but when reading a xml it seems that the converters i registered are ignored since xstream doesnt manage to parse some fields correctly.

Here is the init function of the marshaller:

public void init() {
    XStream xstream = new XStream() {

        protected MapperWrapper wrapMapper(MapperWrapper next) {
            return new MapperWrapper(next) {

                public boolean shouldSerializeMember(Class definedIn, String fieldName) {
                    return definedIn != Object.class ? super.shouldSerializeMember(definedIn, fieldName) : false;
                }

            };
        }

    };
    xstream.setMode(XStream.NO_REFERENCES);
    xstream.addDefaultImplementation(ArrayList.class, PersistentList.class);
    xstream.addDefaultImplementation(ArrayList.class, PersistentBag.class);
    xstream.addDefaultImplementation(HashMap.class, PersistentMap.class); 
    xstream.addDefaultImplementation(java.util.HashSet.class, PersistentSet.class);

    xstream.alias("Array", PersistentBag.class);
    xstream.alias("list", PersistentBag.class);

    Mapper mapper = xstream.getMapper();
    xstream.registerConverter(new HibernateCollectionConverter(mapper));
    xstream.registerConverter(new HibernateMapConverter(mapper));
    xstream.registerConverter(new DateConverter());
    xstream.registerConverter(new TimeStampCustomConverter());
    xstream.registerConverter(new LongConverter());
    xstream.registerConverter(new IntConverter());
    xstream.registerConverter(new DoubleConverter());

}

What am i missing?


Solution

  • You register converters etc. on a specific instance of the XStream class, so you need to save a reference to your configured XStream somewhere other than in a local variable of your init() method. Or alternatively, make it a method that returns the XStream and then call that whenever you need a marshaller:

    protected XStream createXStream() {
      XStream xs = new XStream();
      // ...
      xs.registerConverter(...);
      return xs;
    }