SPR-7034 - XmlBeans UnMarshalling - does not work with RequestBody annotation
This commit is contained in:
parent
fbda55f141
commit
f836601e0f
|
|
@ -21,8 +21,11 @@ import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.io.Reader;
|
import java.io.Reader;
|
||||||
import java.io.Writer;
|
import java.io.Writer;
|
||||||
|
import java.io.FilterInputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
|
import java.nio.CharBuffer;
|
||||||
import javax.xml.stream.XMLEventReader;
|
import javax.xml.stream.XMLEventReader;
|
||||||
import javax.xml.stream.XMLEventWriter;
|
import javax.xml.stream.XMLEventWriter;
|
||||||
import javax.xml.stream.XMLStreamReader;
|
import javax.xml.stream.XMLStreamReader;
|
||||||
|
|
@ -35,6 +38,8 @@ import org.apache.xmlbeans.XmlObject;
|
||||||
import org.apache.xmlbeans.XmlOptions;
|
import org.apache.xmlbeans.XmlOptions;
|
||||||
import org.apache.xmlbeans.XmlSaxHandler;
|
import org.apache.xmlbeans.XmlSaxHandler;
|
||||||
import org.apache.xmlbeans.XmlValidationError;
|
import org.apache.xmlbeans.XmlValidationError;
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.Document;
|
||||||
import org.w3c.dom.Node;
|
import org.w3c.dom.Node;
|
||||||
import org.w3c.dom.NodeList;
|
import org.w3c.dom.NodeList;
|
||||||
|
|
@ -181,7 +186,8 @@ public class XmlBeansMarshaller extends AbstractMarshaller {
|
||||||
@Override
|
@Override
|
||||||
protected final Object unmarshalInputStream(InputStream inputStream) throws XmlMappingException, IOException {
|
protected final Object unmarshalInputStream(InputStream inputStream) throws XmlMappingException, IOException {
|
||||||
try {
|
try {
|
||||||
XmlObject object = XmlObject.Factory.parse(inputStream, getXmlOptions());
|
InputStream nonClosingInputStream = new NonClosingInputStream(inputStream);
|
||||||
|
XmlObject object = XmlObject.Factory.parse(nonClosingInputStream, getXmlOptions());
|
||||||
validate(object);
|
validate(object);
|
||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
@ -193,7 +199,8 @@ public class XmlBeansMarshaller extends AbstractMarshaller {
|
||||||
@Override
|
@Override
|
||||||
protected final Object unmarshalReader(Reader reader) throws XmlMappingException, IOException {
|
protected final Object unmarshalReader(Reader reader) throws XmlMappingException, IOException {
|
||||||
try {
|
try {
|
||||||
XmlObject object = XmlObject.Factory.parse(reader, getXmlOptions());
|
Reader nonClosingReader = new NonClosingReader(reader);
|
||||||
|
XmlObject object = XmlObject.Factory.parse(nonClosingReader, getXmlOptions());
|
||||||
validate(object);
|
validate(object);
|
||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
@ -307,4 +314,160 @@ public class XmlBeansMarshaller extends AbstractMarshaller {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See SPR-7034
|
||||||
|
*/
|
||||||
|
private static class NonClosingInputStream extends InputStream {
|
||||||
|
|
||||||
|
private final WeakReference<InputStream> in;
|
||||||
|
|
||||||
|
private NonClosingInputStream(InputStream in) {
|
||||||
|
this.in = new WeakReference<InputStream>(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
private InputStream getInputStream() {
|
||||||
|
return this.in.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int read() throws IOException {
|
||||||
|
InputStream in = getInputStream();
|
||||||
|
return in != null ? in.read() : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int read(byte[] b) throws IOException {
|
||||||
|
InputStream in = getInputStream();
|
||||||
|
return in != null ? in.read(b) : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int read(byte[] b, int off, int len) throws IOException {
|
||||||
|
InputStream in = getInputStream();
|
||||||
|
return in != null ? in.read(b, off, len) : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long skip(long n) throws IOException {
|
||||||
|
InputStream in = getInputStream();
|
||||||
|
return in != null ? in.skip(n) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean markSupported() {
|
||||||
|
InputStream in = getInputStream();
|
||||||
|
return in != null && in.markSupported();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mark(int readlimit) {
|
||||||
|
InputStream in = getInputStream();
|
||||||
|
if (in != null) {
|
||||||
|
in.mark(readlimit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reset() throws IOException {
|
||||||
|
InputStream in = getInputStream();
|
||||||
|
if (in != null) {
|
||||||
|
in.reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int available() throws IOException {
|
||||||
|
InputStream in = getInputStream();
|
||||||
|
return in != null ? in.available() : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws IOException {
|
||||||
|
InputStream in = getInputStream();
|
||||||
|
if(in != null) {
|
||||||
|
this.in.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class NonClosingReader extends Reader {
|
||||||
|
|
||||||
|
private final WeakReference<Reader> reader;
|
||||||
|
|
||||||
|
private NonClosingReader(Reader reader) {
|
||||||
|
this.reader = new WeakReference<Reader>(reader);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Reader getReader() {
|
||||||
|
return this.reader.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int read(CharBuffer target) throws IOException {
|
||||||
|
Reader rdr = getReader();
|
||||||
|
return rdr != null ? rdr.read(target) : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int read() throws IOException {
|
||||||
|
Reader rdr = getReader();
|
||||||
|
return rdr != null ? rdr.read() : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int read(char[] cbuf) throws IOException {
|
||||||
|
Reader rdr = getReader();
|
||||||
|
return rdr != null ? rdr.read(cbuf) : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int read(char[] cbuf, int off, int len) throws IOException {
|
||||||
|
Reader rdr = getReader();
|
||||||
|
return rdr != null ? rdr.read(cbuf, off, len) : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long skip(long n) throws IOException {
|
||||||
|
Reader rdr = getReader();
|
||||||
|
return rdr != null ? rdr.skip(n) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean ready() throws IOException {
|
||||||
|
Reader rdr = getReader();
|
||||||
|
return rdr != null && rdr.ready();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean markSupported() {
|
||||||
|
Reader rdr = getReader();
|
||||||
|
return rdr != null && rdr.markSupported();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mark(int readAheadLimit) throws IOException {
|
||||||
|
Reader rdr = getReader();
|
||||||
|
if (rdr != null) {
|
||||||
|
rdr.mark(readAheadLimit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reset() throws IOException {
|
||||||
|
Reader rdr = getReader();
|
||||||
|
if (rdr != null) {
|
||||||
|
rdr.reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws IOException {
|
||||||
|
Reader rdr = getReader();
|
||||||
|
if (rdr != null) {
|
||||||
|
this.reader.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue