XStreamMarshaller lazily creates fallback XppDriver

Issue: SPR-11635
This commit is contained in:
Juergen Hoeller
2014-04-09 17:42:45 +02:00
parent 8d8766dda9
commit 8f28a9352e
2 changed files with 13 additions and 10 deletions

View File

@@ -124,7 +124,7 @@ public class XStreamMarshaller extends AbstractMarshaller implements Initializin
private HierarchicalStreamDriver streamDriver;
private final XppDriver fallbackDriver = new XppDriver();
private HierarchicalStreamDriver defaultDriver;
private Mapper mapper;
@@ -182,6 +182,14 @@ public class XStreamMarshaller extends AbstractMarshaller implements Initializin
*/
public void setStreamDriver(HierarchicalStreamDriver streamDriver) {
this.streamDriver = streamDriver;
this.defaultDriver = streamDriver;
}
private HierarchicalStreamDriver getDefaultDriver() {
if (this.defaultDriver == null) {
this.defaultDriver = new XppDriver();
}
return this.defaultDriver;
}
/**
@@ -389,7 +397,7 @@ public class XStreamMarshaller extends AbstractMarshaller implements Initializin
protected XStream constructXStream() {
// The referenced XStream constructor has been deprecated as of 1.4.5.
// We're preserving this call for broader XStream 1.4.x compatibility.
return new XStream(this.reflectionProvider, this.streamDriver,
return new XStream(this.reflectionProvider, getDefaultDriver(),
this.beanClassLoader, this.mapper, this.converterLookup, this.converterRegistry) {
@Override
protected MapperWrapper wrapMapper(MapperWrapper next) {
@@ -545,7 +553,7 @@ public class XStreamMarshaller extends AbstractMarshaller implements Initializin
xstream.processAnnotations(this.annotatedClasses);
}
if (this.autodetectAnnotations) {
xstream.autodetectAnnotations(this.autodetectAnnotations);
xstream.autodetectAnnotations(true);
}
}
@@ -776,12 +784,7 @@ public class XStreamMarshaller extends AbstractMarshaller implements Initializin
}
public Object unmarshalReader(Reader reader, DataHolder dataHolder) throws XmlMappingException, IOException {
if (this.streamDriver != null) {
return doUnmarshal(this.streamDriver.createReader(reader), dataHolder);
}
else {
return doUnmarshal(this.fallbackDriver.createReader(reader), dataHolder);
}
return doUnmarshal(getDefaultDriver().createReader(reader), dataHolder);
}
/**

View File

@@ -49,7 +49,7 @@ public class XStreamUnmarshallerTests {
private XStreamMarshaller unmarshaller;
@Before
public void creteUnmarshaller() throws Exception {
public void createUnmarshaller() throws Exception {
unmarshaller = new XStreamMarshaller();
Map<String, Class<?>> aliases = new HashMap<String, Class<?>>();
aliases.put("flight", Flight.class);