@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2012 the original author or authors.
|
||||
* Copyright 2002-2014 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -26,7 +26,6 @@ import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.SortedSet;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import javax.xml.bind.JAXBException;
|
||||
import javax.xml.bind.UnmarshalException;
|
||||
import javax.xml.bind.Unmarshaller;
|
||||
@@ -54,6 +53,7 @@ import org.springframework.http.converter.HttpMessageNotReadableException;
|
||||
* does not support writing.
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
* @author Rossen Stoyanchev
|
||||
* @since 3.2
|
||||
*/
|
||||
public class Jaxb2CollectionHttpMessageConverter<T extends Collection>
|
||||
@@ -61,6 +61,7 @@ public class Jaxb2CollectionHttpMessageConverter<T extends Collection>
|
||||
|
||||
private final XMLInputFactory inputFactory = createXmlInputFactory();
|
||||
|
||||
|
||||
/**
|
||||
* Always returns {@code false} since Jaxb2CollectionHttpMessageConverter
|
||||
* required generic type information in order to read a Collection.
|
||||
@@ -121,6 +122,7 @@ public class Jaxb2CollectionHttpMessageConverter<T extends Collection>
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public T read(Type type, Class<?> contextClass, HttpInputMessage inputMessage)
|
||||
throws IOException, HttpMessageNotReadableException {
|
||||
|
||||
@@ -162,7 +164,6 @@ public class Jaxb2CollectionHttpMessageConverter<T extends Collection>
|
||||
/**
|
||||
* Create a Collection of the given type, with the given initial capacity
|
||||
* (if supported by the Collection type).
|
||||
*
|
||||
* @param collectionClass the type of Collection to instantiate
|
||||
* @return the created Collection instance
|
||||
*/
|
||||
@@ -220,14 +221,12 @@ public class Jaxb2CollectionHttpMessageConverter<T extends Collection>
|
||||
/**
|
||||
* Create a {@code XMLInputFactory} that this converter will use to create {@link
|
||||
* javax.xml.stream.XMLStreamReader} and {@link javax.xml.stream.XMLEventReader} objects.
|
||||
* <p/> Can be overridden in subclasses, adding further initialization of the factory.
|
||||
* <p>Can be overridden in subclasses, adding further initialization of the factory.
|
||||
* The resulting factory is cached, so this method will only be called once.
|
||||
*
|
||||
* @return the created factory
|
||||
*/
|
||||
protected XMLInputFactory createXmlInputFactory() {
|
||||
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
|
||||
inputFactory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false);
|
||||
inputFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
|
||||
inputFactory.setXMLResolver(NO_OP_XML_RESOLVER);
|
||||
return inputFactory;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2010 the original author or authors.
|
||||
* Copyright 2002-2014 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -32,6 +32,12 @@ import javax.xml.transform.Source;
|
||||
import javax.xml.transform.sax.SAXSource;
|
||||
import javax.xml.transform.stream.StreamSource;
|
||||
|
||||
import org.xml.sax.EntityResolver;
|
||||
import org.xml.sax.InputSource;
|
||||
import org.xml.sax.SAXException;
|
||||
import org.xml.sax.XMLReader;
|
||||
import org.xml.sax.helpers.XMLReaderFactory;
|
||||
|
||||
import org.springframework.core.annotation.AnnotationUtils;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.MediaType;
|
||||
@@ -39,25 +45,22 @@ import org.springframework.http.converter.HttpMessageConversionException;
|
||||
import org.springframework.http.converter.HttpMessageNotReadableException;
|
||||
import org.springframework.http.converter.HttpMessageNotWritableException;
|
||||
import org.springframework.util.ClassUtils;
|
||||
import org.xml.sax.EntityResolver;
|
||||
import org.xml.sax.InputSource;
|
||||
import org.xml.sax.SAXException;
|
||||
import org.xml.sax.XMLReader;
|
||||
import org.xml.sax.helpers.XMLReaderFactory;
|
||||
|
||||
/**
|
||||
* Implementation of {@link org.springframework.http.converter.HttpMessageConverter HttpMessageConverter} that can read
|
||||
* and write XML using JAXB2.
|
||||
* Implementation of {@link org.springframework.http.converter.HttpMessageConverter HttpMessageConverter}
|
||||
* that can read and write XML using JAXB2.
|
||||
*
|
||||
* <p>This converter can read classes annotated with {@link XmlRootElement} and {@link XmlType}, and write classes
|
||||
* annotated with with {@link XmlRootElement}, or subclasses thereof.
|
||||
* <p>This converter can read classes annotated with {@link XmlRootElement} and {@link XmlType},
|
||||
* and write classes annotated with with {@link XmlRootElement}, or subclasses thereof.
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
* @author Sebastien Deleuze
|
||||
* @author Rossen Stoyanchev
|
||||
* @since 3.0
|
||||
*/
|
||||
public class Jaxb2RootElementHttpMessageConverter extends AbstractJaxb2HttpMessageConverter<Object> {
|
||||
|
||||
private boolean processExternalEntities = false;
|
||||
private boolean processExternalEntities = false;
|
||||
|
||||
|
||||
/**
|
||||
@@ -68,6 +71,9 @@ public class Jaxb2RootElementHttpMessageConverter extends AbstractJaxb2HttpMessa
|
||||
this.processExternalEntities = processExternalEntities;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the configured value for whether XML external entities are allowed.
|
||||
*/
|
||||
public boolean isProcessExternalEntities() {
|
||||
return this.processExternalEntities;
|
||||
}
|
||||
@@ -81,7 +87,7 @@ public class Jaxb2RootElementHttpMessageConverter extends AbstractJaxb2HttpMessa
|
||||
|
||||
@Override
|
||||
public boolean canWrite(Class<?> clazz, MediaType mediaType) {
|
||||
return AnnotationUtils.findAnnotation(clazz, XmlRootElement.class) != null && canWrite(mediaType);
|
||||
return (AnnotationUtils.findAnnotation(clazz, XmlRootElement.class) != null && canWrite(mediaType));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -99,7 +105,7 @@ public class Jaxb2RootElementHttpMessageConverter extends AbstractJaxb2HttpMessa
|
||||
return unmarshaller.unmarshal(source);
|
||||
}
|
||||
else {
|
||||
JAXBElement jaxbElement = unmarshaller.unmarshal(source, clazz);
|
||||
JAXBElement<?> jaxbElement = unmarshaller.unmarshal(source, clazz);
|
||||
return jaxbElement.getValue();
|
||||
}
|
||||
}
|
||||
@@ -138,7 +144,7 @@ public class Jaxb2RootElementHttpMessageConverter extends AbstractJaxb2HttpMessa
|
||||
@Override
|
||||
protected void writeToResult(Object o, HttpHeaders headers, Result result) throws IOException {
|
||||
try {
|
||||
Class clazz = ClassUtils.getUserClass(o);
|
||||
Class<?> clazz = ClassUtils.getUserClass(o);
|
||||
Marshaller marshaller = createMarshaller(clazz);
|
||||
setCharset(headers.getContentType(), marshaller);
|
||||
marshaller.marshal(o, result);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2013 the original author or authors.
|
||||
* Copyright 2002-2014 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -57,6 +57,7 @@ import org.springframework.util.StreamUtils;
|
||||
* that can read and write {@link Source} objects.
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
* @author Rossen Stoyanchev
|
||||
* @since 3.0
|
||||
*/
|
||||
public class SourceHttpMessageConverter<T extends Source> extends AbstractHttpMessageConverter<T> {
|
||||
@@ -94,12 +95,13 @@ public class SourceHttpMessageConverter<T extends Source> extends AbstractHttpMe
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the configured value for whether XML external entities are allowed.
|
||||
* Returns the configured value for whether XML external entities are allowed.
|
||||
*/
|
||||
public boolean isProcessExternalEntities() {
|
||||
return this.processExternalEntities;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean supports(Class<?> clazz) {
|
||||
return SUPPORTED_CLASSES.contains(clazz);
|
||||
@@ -150,8 +152,7 @@ public class SourceHttpMessageConverter<T extends Source> extends AbstractHttpMe
|
||||
private SAXSource readSAXSource(InputStream body) throws IOException {
|
||||
try {
|
||||
XMLReader reader = XMLReaderFactory.createXMLReader();
|
||||
reader.setFeature(
|
||||
"http://xml.org/sax/features/external-general-entities", isProcessExternalEntities());
|
||||
reader.setFeature("http://xml.org/sax/features/external-general-entities", isProcessExternalEntities());
|
||||
byte[] bytes = StreamUtils.copyToByteArray(body);
|
||||
if (!isProcessExternalEntities()) {
|
||||
reader.setEntityResolver(NO_OP_ENTITY_RESOLVER);
|
||||
|
||||
Reference in New Issue
Block a user