diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/jaxb/Jaxb2Marshaller.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/jaxb/Jaxb2Marshaller.java index 890ce18c679..2d23572100d 100644 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/jaxb/Jaxb2Marshaller.java +++ b/org.springframework.oxm/src/main/java/org/springframework/oxm/jaxb/Jaxb2Marshaller.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * Copyright 2002-2011 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. @@ -158,6 +158,8 @@ public class Jaxb2Marshaller private boolean lazyInit = false; + private boolean supportJaxbElementClass = false; + /** * Set multiple JAXB context paths. The given array of context paths is converted to a @@ -301,6 +303,22 @@ public class Jaxb2Marshaller this.lazyInit = lazyInit; } + /** + * Specify whether the {@link #supports(Class)} returns {@code true} for the {@link JAXBElement} class. + *

Default is {@code false}, meaning that {@code supports(Class)} always returns {@code false} for + * {@code JAXBElement} classes (though {@link #supports(Type)} can return {@code true}, since it can obtain the + * type parameters of {@code JAXBElement}). + *

This property is typically enabled in combination with usage of classes like + * {@link org.springframework.web.servlet.view.xml.MarshallingView MarshallingView}, since the {@code ModelAndView} + * does not offer type parameter information at runtime. + * + * @see #supports(Class) + * @see #supports(Type) + */ + public void setSupportJaxbElementClass(boolean supportJaxbElementClass) { + this.supportJaxbElementClass = supportJaxbElementClass; + } + public void setBeanClassLoader(ClassLoader classLoader) { this.beanClassLoader = classLoader; } @@ -394,6 +412,9 @@ public class Jaxb2Marshaller public boolean supports(Class clazz) { + if (supportJaxbElementClass && JAXBElement.class.isAssignableFrom(clazz)) { + return true; + } return supportsInternal(clazz, true); } diff --git a/org.springframework.oxm/src/test/java/org/springframework/oxm/jaxb/Jaxb2MarshallerTests.java b/org.springframework.oxm/src/test/java/org/springframework/oxm/jaxb/Jaxb2MarshallerTests.java index 96094c8a480..8e743037072 100644 --- a/org.springframework.oxm/src/test/java/org/springframework/oxm/jaxb/Jaxb2MarshallerTests.java +++ b/org.springframework.oxm/src/test/java/org/springframework/oxm/jaxb/Jaxb2MarshallerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * Copyright 2002-2011 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. @@ -27,15 +27,11 @@ import javax.activation.FileDataSource; import javax.xml.bind.JAXBElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; +import javax.xml.namespace.QName; import javax.xml.transform.Result; import javax.xml.transform.sax.SAXResult; import javax.xml.transform.stream.StreamResult; -import static org.custommonkey.xmlunit.XMLAssert.assertFalse; -import static org.custommonkey.xmlunit.XMLAssert.*; -import static org.custommonkey.xmlunit.XMLAssert.fail; -import static org.easymock.EasyMock.*; -import static org.junit.Assert.assertTrue; import org.junit.Test; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; @@ -54,6 +50,12 @@ import org.springframework.oxm.mime.MimeContainer; import org.springframework.util.FileCopyUtils; import org.springframework.util.ReflectionUtils; +import static org.custommonkey.xmlunit.XMLAssert.assertFalse; +import static org.custommonkey.xmlunit.XMLAssert.*; +import static org.custommonkey.xmlunit.XMLAssert.fail; +import static org.easymock.EasyMock.*; +import static org.junit.Assert.assertTrue; + public class Jaxb2MarshallerTests extends AbstractMarshallerTests { private static final String CONTEXT_PATH = "org.springframework.oxm.jaxb.test"; @@ -105,7 +107,7 @@ public class Jaxb2MarshallerTests extends AbstractMarshallerTests { } @Test - public void laxyInit() throws Exception { + public void lazyInit() throws Exception { marshaller = new Jaxb2Marshaller(); marshaller.setContextPath(CONTEXT_PATH); marshaller.setLazyInit(true); @@ -152,7 +154,6 @@ public class Jaxb2MarshallerTests extends AbstractMarshallerTests { @Test public void supportsContextPath() throws Exception { testSupports(); - } @Test @@ -174,6 +175,11 @@ public class Jaxb2MarshallerTests extends AbstractMarshallerTests { assertTrue("Jaxb2Marshaller does not support JAXBElement", marshaller.supports(method.getGenericReturnType())); + marshaller.setSupportJaxbElementClass(true); + JAXBElement flightTypeJAXBElement = new JAXBElement(new QName("http://springframework.org", "flight"), FlightType.class, + new FlightType()); + assertTrue("Jaxb2Marshaller does not support JAXBElement", marshaller.supports(flightTypeJAXBElement.getClass())); + assertFalse("Jaxb2Marshaller supports class not in context path", marshaller.supports(DummyRootElement.class)); assertFalse("Jaxb2Marshaller supports type not in context path", marshaller.supports((Type)DummyRootElement.class)); method = getClass().getDeclaredMethod("createDummyRootElement");