Browse Source
- Introcuces XmlEventDecoder which decodes from DataBuffer to javax.xml.stream.events.XMLEvent. It uses the Aalto async XML API if available, but falls back to a blocking default if not. - Refacors Jaxb2Decoder to use said XmlEventDecoder, and split the stream of events into separate substreams by using the JAXB annotation value, one stream for each part of the tree that can be unmarshaled to the given type. - Various improvements in the JAXB code.pull/1111/head
Arjen Poutsma
9 years ago
18 changed files with 1101 additions and 124 deletions
@ -0,0 +1,56 @@
@@ -0,0 +1,56 @@
|
||||
/* |
||||
* Copyright 2002-2016 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. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.core.codec.support; |
||||
|
||||
import java.util.concurrent.ConcurrentHashMap; |
||||
import java.util.concurrent.ConcurrentMap; |
||||
import javax.xml.bind.JAXBContext; |
||||
import javax.xml.bind.JAXBException; |
||||
import javax.xml.bind.Marshaller; |
||||
import javax.xml.bind.Unmarshaller; |
||||
|
||||
import org.springframework.util.Assert; |
||||
|
||||
/** |
||||
* @author Arjen Poutsma |
||||
*/ |
||||
final class JaxbContextContainer { |
||||
|
||||
private final ConcurrentMap<Class<?>, JAXBContext> jaxbContexts = |
||||
new ConcurrentHashMap<>(64); |
||||
|
||||
public Marshaller createMarshaller(Class<?> clazz) throws JAXBException { |
||||
JAXBContext jaxbContext = getJaxbContext(clazz); |
||||
return jaxbContext.createMarshaller(); |
||||
} |
||||
|
||||
public Unmarshaller createUnmarshaller(Class<?> clazz) throws JAXBException { |
||||
JAXBContext jaxbContext = getJaxbContext(clazz); |
||||
return jaxbContext.createUnmarshaller(); |
||||
} |
||||
|
||||
private JAXBContext getJaxbContext(Class<?> clazz) throws JAXBException { |
||||
Assert.notNull(clazz, "'clazz' must not be null"); |
||||
JAXBContext jaxbContext = this.jaxbContexts.get(clazz); |
||||
if (jaxbContext == null) { |
||||
jaxbContext = JAXBContext.newInstance(clazz); |
||||
this.jaxbContexts.putIfAbsent(clazz, jaxbContext); |
||||
} |
||||
return jaxbContext; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,151 @@
@@ -0,0 +1,151 @@
|
||||
/* |
||||
* Copyright 2002-2016 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. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.core.codec.support; |
||||
|
||||
import java.util.List; |
||||
import java.util.NoSuchElementException; |
||||
import javax.xml.stream.XMLEventReader; |
||||
import javax.xml.stream.XMLStreamConstants; |
||||
import javax.xml.stream.XMLStreamException; |
||||
import javax.xml.stream.events.Characters; |
||||
import javax.xml.stream.events.XMLEvent; |
||||
|
||||
import org.springframework.util.Assert; |
||||
import org.springframework.util.ClassUtils; |
||||
|
||||
/** |
||||
* TODO: move to org.springframework.util.xml when merging, hidden behind StaxUtils |
||||
* |
||||
* @author Arjen Poutsma |
||||
*/ |
||||
class ListBasedXMLEventReader implements XMLEventReader { |
||||
|
||||
private final XMLEvent[] events; |
||||
|
||||
private int cursor = 0; |
||||
|
||||
public ListBasedXMLEventReader(List<XMLEvent> events) { |
||||
Assert.notNull(events, "'events' must not be null"); |
||||
this.events = events.toArray(new XMLEvent[events.size()]); |
||||
} |
||||
|
||||
@Override |
||||
public boolean hasNext() { |
||||
Assert.notNull(events, "'events' must not be null"); |
||||
return cursor != events.length; |
||||
} |
||||
|
||||
@Override |
||||
public XMLEvent nextEvent() { |
||||
if (cursor < events.length) { |
||||
return events[cursor++]; |
||||
} |
||||
else { |
||||
throw new NoSuchElementException(); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public XMLEvent peek() { |
||||
if (cursor < events.length) { |
||||
return events[cursor]; |
||||
} |
||||
else { |
||||
return null; |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public Object next() { |
||||
return nextEvent(); |
||||
} |
||||
|
||||
/** |
||||
* Throws an {@code UnsupportedOperationException} when called. |
||||
* @throws UnsupportedOperationException when called |
||||
*/ |
||||
@Override |
||||
public void remove() { |
||||
throw new UnsupportedOperationException( |
||||
"remove not supported on " + ClassUtils.getShortName(getClass())); |
||||
} |
||||
|
||||
@Override |
||||
public String getElementText() throws XMLStreamException { |
||||
if (!peek().isStartElement()) { |
||||
throw new XMLStreamException("Not at START_ELEMENT"); |
||||
} |
||||
|
||||
StringBuilder builder = new StringBuilder(); |
||||
while (true) { |
||||
XMLEvent event = nextEvent(); |
||||
if (event.isEndElement()) { |
||||
break; |
||||
} |
||||
else if (!event.isCharacters()) { |
||||
throw new XMLStreamException( |
||||
"Unexpected event [" + event + "] in getElementText()"); |
||||
} |
||||
Characters characters = event.asCharacters(); |
||||
if (!characters.isIgnorableWhiteSpace()) { |
||||
builder.append(event.asCharacters().getData()); |
||||
} |
||||
} |
||||
return builder.toString(); |
||||
} |
||||
|
||||
@Override |
||||
public XMLEvent nextTag() throws XMLStreamException { |
||||
while (true) { |
||||
XMLEvent event = nextEvent(); |
||||
switch (event.getEventType()) { |
||||
case XMLStreamConstants.START_ELEMENT: |
||||
case XMLStreamConstants.END_ELEMENT: |
||||
return event; |
||||
case XMLStreamConstants.END_DOCUMENT: |
||||
return null; |
||||
case XMLStreamConstants.SPACE: |
||||
case XMLStreamConstants.COMMENT: |
||||
case XMLStreamConstants.PROCESSING_INSTRUCTION: |
||||
continue; |
||||
case XMLStreamConstants.CDATA: |
||||
case XMLStreamConstants.CHARACTERS: |
||||
if (!event.asCharacters().isWhiteSpace()) { |
||||
throw new XMLStreamException( |
||||
"Non-ignorable whitespace CDATA or CHARACTERS event in nextTag()"); |
||||
} |
||||
break; |
||||
default: |
||||
throw new XMLStreamException("Received event [" + event + |
||||
"], instead of START_ELEMENT or END_ELEMENT."); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Throws an {@code IllegalArgumentException} when called. |
||||
* @throws IllegalArgumentException when called. |
||||
*/ |
||||
@Override |
||||
public Object getProperty(String name) throws IllegalArgumentException { |
||||
throw new IllegalArgumentException("Property not supported: [" + name + "]"); |
||||
} |
||||
|
||||
@Override |
||||
public void close() { |
||||
} |
||||
} |
@ -0,0 +1,145 @@
@@ -0,0 +1,145 @@
|
||||
/* |
||||
* Copyright 2002-2016 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. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.core.codec.support; |
||||
|
||||
import java.io.InputStream; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import java.util.function.Function; |
||||
import javax.xml.stream.XMLEventReader; |
||||
import javax.xml.stream.XMLInputFactory; |
||||
import javax.xml.stream.XMLStreamException; |
||||
import javax.xml.stream.events.XMLEvent; |
||||
import javax.xml.stream.util.XMLEventAllocator; |
||||
|
||||
import com.fasterxml.aalto.AsyncByteBufferFeeder; |
||||
import com.fasterxml.aalto.AsyncXMLInputFactory; |
||||
import com.fasterxml.aalto.AsyncXMLStreamReader; |
||||
import com.fasterxml.aalto.evt.EventAllocatorImpl; |
||||
import org.reactivestreams.Publisher; |
||||
import reactor.core.publisher.Flux; |
||||
import reactor.core.publisher.Mono; |
||||
|
||||
import org.springframework.core.ResolvableType; |
||||
import org.springframework.core.io.buffer.DataBuffer; |
||||
import org.springframework.core.io.buffer.support.DataBufferUtils; |
||||
import org.springframework.util.ClassUtils; |
||||
import org.springframework.util.MimeType; |
||||
import org.springframework.util.MimeTypeUtils; |
||||
|
||||
/** |
||||
* Decodes a {@link DataBuffer} stream into a stream of {@link XMLEvent}s. That is, given |
||||
* the following XML: |
||||
* <pre>{@code |
||||
* <root> |
||||
* <child>foo</child> |
||||
* <child>bar</child> |
||||
* </root>} |
||||
* </pre> |
||||
* this method with result in a flux with the following events: |
||||
* <ol> |
||||
* <li>{@link javax.xml.stream.events.StartDocument}</li> |
||||
* <li>{@link javax.xml.stream.events.StartElement} {@code root}</li> |
||||
* <li>{@link javax.xml.stream.events.StartElement} {@code child}</li> |
||||
* <li>{@link javax.xml.stream.events.Characters} {@code foo}</li> |
||||
* <li>{@link javax.xml.stream.events.EndElement} {@code child}</li> |
||||
* <li>{@link javax.xml.stream.events.StartElement} {@code child}</li> |
||||
* <li>{@link javax.xml.stream.events.Characters} {@code bar}</li> |
||||
* <li>{@link javax.xml.stream.events.EndElement} {@code child}</li> |
||||
* <li>{@link javax.xml.stream.events.EndElement} {@code root}</li> |
||||
* </ol> |
||||
* |
||||
* Note that this decoder is not registered by default, but used internally by other |
||||
* decoders who are. |
||||
* |
||||
* @author Arjen Poutsma |
||||
*/ |
||||
public class XmlEventDecoder extends AbstractDecoder<XMLEvent> { |
||||
|
||||
private static final boolean aaltoPresent = ClassUtils |
||||
.isPresent("com.fasterxml.aalto.AsyncXMLStreamReader", |
||||
XmlEventDecoder.class.getClassLoader()); |
||||
|
||||
private static final XMLInputFactory inputFactory = XMLInputFactory.newFactory(); |
||||
|
||||
public XmlEventDecoder() { |
||||
super(MimeTypeUtils.APPLICATION_XML, MimeTypeUtils.TEXT_XML); |
||||
} |
||||
|
||||
@Override |
||||
public Flux<XMLEvent> decode(Publisher<DataBuffer> inputStream, ResolvableType type, |
||||
MimeType mimeType, Object... hints) { |
||||
if (aaltoPresent) { |
||||
return Flux.from(inputStream).flatMap(new AaltoDataBufferToXmlEvent()); |
||||
} |
||||
else { |
||||
try { |
||||
InputStream blockingStream = DataBufferUtils.toInputStream(inputStream); |
||||
|
||||
XMLEventReader eventReader = |
||||
inputFactory.createXMLEventReader(blockingStream); |
||||
|
||||
return Flux.fromIterable((Iterable<XMLEvent>) () -> eventReader); |
||||
} |
||||
catch (XMLStreamException ex) { |
||||
return Flux.error(ex); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/* |
||||
* Separate static class to isolate Aalto dependency. |
||||
*/ |
||||
private static class AaltoDataBufferToXmlEvent |
||||
implements Function<DataBuffer, Publisher<? extends XMLEvent>> { |
||||
|
||||
private static final AsyncXMLInputFactory inputFactory = |
||||
(AsyncXMLInputFactory) XmlEventDecoder.inputFactory; |
||||
|
||||
private final AsyncXMLStreamReader<AsyncByteBufferFeeder> streamReader = |
||||
inputFactory.createAsyncForByteBuffer(); |
||||
|
||||
private final XMLEventAllocator eventAllocator = |
||||
EventAllocatorImpl.getDefaultInstance(); |
||||
|
||||
@Override |
||||
public Publisher<? extends XMLEvent> apply(DataBuffer dataBuffer) { |
||||
try { |
||||
streamReader.getInputFeeder().feedInput(dataBuffer.asByteBuffer()); |
||||
List<XMLEvent> events = new ArrayList<>(); |
||||
while (true) { |
||||
if (streamReader.next() == AsyncXMLStreamReader.EVENT_INCOMPLETE) { |
||||
// no more events with what currently has been fed to the reader
|
||||
break; |
||||
} |
||||
else { |
||||
XMLEvent event = eventAllocator.allocate(streamReader); |
||||
events.add(event); |
||||
if (event.isEndDocument()) { |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
return Flux.fromIterable(events); |
||||
} |
||||
catch (XMLStreamException ex) { |
||||
return Mono.error(ex); |
||||
} |
||||
|
||||
} |
||||
} |
||||
} |
@ -0,0 +1,77 @@
@@ -0,0 +1,77 @@
|
||||
/* |
||||
* Copyright 2002-2016 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. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.core.codec.support; |
||||
|
||||
import javax.xml.stream.events.XMLEvent; |
||||
|
||||
import org.junit.Test; |
||||
import reactor.core.publisher.Flux; |
||||
import reactor.core.test.TestSubscriber; |
||||
|
||||
import static org.junit.Assert.assertEquals; |
||||
import static org.junit.Assert.assertTrue; |
||||
|
||||
/** |
||||
* @author Arjen Poutsma |
||||
*/ |
||||
public class XmlEventDecoderTests extends AbstractAllocatingTestCase { |
||||
|
||||
private static final String XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + |
||||
"<pojo>" + |
||||
"<foo>foofoo</foo>" + |
||||
"<bar>barbar</bar>" + |
||||
"</pojo>"; |
||||
|
||||
private XmlEventDecoder decoder = new XmlEventDecoder(); |
||||
|
||||
@Test |
||||
public void toXMLEvents() { |
||||
|
||||
Flux<XMLEvent> events = decoder.decode(Flux.just(stringBuffer(XML)), null, null); |
||||
|
||||
TestSubscriber<XMLEvent> testSubscriber = new TestSubscriber<>(); |
||||
testSubscriber.bindTo(events). |
||||
assertNoError(). |
||||
assertComplete(). |
||||
assertValuesWith(e -> assertTrue(e.isStartDocument()), |
||||
e -> assertStartElement(e, "pojo"), |
||||
e -> assertStartElement(e, "foo"), |
||||
e -> assertCharacters(e, "foofoo"), |
||||
e -> assertEndElement(e, "foo"), |
||||
e -> assertStartElement(e, "bar"), |
||||
e -> assertCharacters(e, "barbar"), |
||||
e -> assertEndElement(e, "bar"), |
||||
e -> assertEndElement(e, "pojo")); |
||||
} |
||||
|
||||
private static void assertStartElement(XMLEvent event, String expectedLocalName) { |
||||
assertTrue(event.isStartElement()); |
||||
assertEquals(expectedLocalName, event.asStartElement().getName().getLocalPart()); |
||||
} |
||||
|
||||
private static void assertEndElement(XMLEvent event, String expectedLocalName) { |
||||
assertTrue(event + " is no end element", event.isEndElement()); |
||||
assertEquals(expectedLocalName, event.asEndElement().getName().getLocalPart()); |
||||
} |
||||
|
||||
private static void assertCharacters(XMLEvent event, String expectedData) { |
||||
assertTrue(event.isCharacters()); |
||||
assertEquals(expectedData, event.asCharacters().getData()); |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,25 @@
@@ -0,0 +1,25 @@
|
||||
/* |
||||
* Copyright 2002-2016 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. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.core.codec.support.jaxb; |
||||
|
||||
/** |
||||
* @author Arjen Poutsma |
||||
*/ |
||||
@javax.xml.bind.annotation.XmlRootElement |
||||
public class XmlRootElement { |
||||
|
||||
} |
@ -0,0 +1,27 @@
@@ -0,0 +1,27 @@
|
||||
/* |
||||
* Copyright 2002-2016 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. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.core.codec.support.jaxb; |
||||
|
||||
import javax.xml.bind.annotation.XmlRootElement; |
||||
|
||||
/** |
||||
* @author Arjen Poutsma |
||||
*/ |
||||
@XmlRootElement(name = "name") |
||||
public class XmlRootElementWithName { |
||||
|
||||
} |
@ -0,0 +1,27 @@
@@ -0,0 +1,27 @@
|
||||
/* |
||||
* Copyright 2002-2016 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. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.core.codec.support.jaxb; |
||||
|
||||
import javax.xml.bind.annotation.XmlRootElement; |
||||
|
||||
/** |
||||
* @author Arjen Poutsma |
||||
*/ |
||||
@XmlRootElement(name = "name", namespace = "namespace") |
||||
public class XmlRootElementWithNameAndNamespace { |
||||
|
||||
} |
@ -0,0 +1,25 @@
@@ -0,0 +1,25 @@
|
||||
/* |
||||
* Copyright 2002-2016 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. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.core.codec.support.jaxb; |
||||
|
||||
/** |
||||
* @author Arjen Poutsma |
||||
*/ |
||||
@javax.xml.bind.annotation.XmlType |
||||
public class XmlType { |
||||
|
||||
} |
@ -0,0 +1,27 @@
@@ -0,0 +1,27 @@
|
||||
/* |
||||
* Copyright 2002-2016 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. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.core.codec.support.jaxb; |
||||
|
||||
import javax.xml.bind.annotation.XmlType; |
||||
|
||||
/** |
||||
* @author Arjen Poutsma |
||||
*/ |
||||
@XmlType(name = "name") |
||||
public class XmlTypeWithName { |
||||
|
||||
} |
@ -0,0 +1,27 @@
@@ -0,0 +1,27 @@
|
||||
/* |
||||
* Copyright 2002-2016 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. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.core.codec.support.jaxb; |
||||
|
||||
import javax.xml.bind.annotation.XmlType; |
||||
|
||||
/** |
||||
* @author Arjen Poutsma |
||||
*/ |
||||
@XmlType(name = "name", namespace = "namespace") |
||||
public class XmlTypeWithNameAndNamespace { |
||||
|
||||
} |
@ -0,0 +1,18 @@
@@ -0,0 +1,18 @@
|
||||
/* |
||||
* Copyright 2002-2016 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. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
@javax.xml.bind.annotation.XmlSchema(namespace = "namespace") |
||||
package org.springframework.core.codec.support.jaxb; |
Loading…
Reference in new issue