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

View File

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