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