diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/DefaultXmlPayloadConverter.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/DefaultXmlPayloadConverter.java index 877e45af26..180062d846 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/DefaultXmlPayloadConverter.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/DefaultXmlPayloadConverter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 the original author or authors. + * Copyright 2002-2017 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. @@ -33,7 +33,6 @@ import org.w3c.dom.Node; import org.xml.sax.InputSource; import org.springframework.messaging.MessagingException; -import org.springframework.xml.transform.StringSource; /** * Default implementation of {@link XmlPayloadConverter}. Supports @@ -133,18 +132,14 @@ public class DefaultXmlPayloadConverter implements XmlPayloadConverter { public Source convertToSource(Object object) { Source source = null; if (object instanceof Source) { - source = (Source) object; + return (Source) object; } else if (object instanceof Document) { - source = new DOMSource((Document) object); - } - else if (object instanceof String) { - source = new StringSource((String) object); + return new DOMSource((Document) object); } else { - throw new MessagingException("unsupported payload type [" + object.getClass().getName() + "]"); + return convertToSource(convertToDocument(object)); } - return source; } protected synchronized DocumentBuilder getDocumentBuilder() { diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/config/XmlPayloadValidatingFilterParser.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/config/XmlPayloadValidatingFilterParser.java index 768cc63fc7..c6fbd4dc98 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/config/XmlPayloadValidatingFilterParser.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/config/XmlPayloadValidatingFilterParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2017 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. @@ -44,7 +44,7 @@ public class XmlPayloadValidatingFilterParser extends AbstractConsumerEndpointPa String schemaLocation = element.getAttribute("schema-location"); boolean validatorDefined = StringUtils.hasText(validator); boolean schemaLocationDefined = StringUtils.hasText(schemaLocation); - if (!(validatorDefined ^ schemaLocationDefined)) { + if (validatorDefined == schemaLocationDefined) { throw new BeanDefinitionStoreException( "Exactly one of 'xml-validator' or 'schema-location' is allowed on the 'validating-filter' element"); } @@ -59,8 +59,11 @@ public class XmlPayloadValidatingFilterParser extends AbstractConsumerEndpointPa selectorBuilder.addConstructorArgReference(validator); } IntegrationNamespaceUtils.setValueIfAttributeDefined(selectorBuilder, element, "throw-exception-on-rejection"); + IntegrationNamespaceUtils.setReferenceIfAttributeDefined(selectorBuilder, element, "xml-converter", "converter"); + filterBuilder.addPropertyValue("targetObject", selectorBuilder.getBeanDefinition()); IntegrationNamespaceUtils.setValueIfAttributeDefined(filterBuilder, element, "send-timeout"); + return filterBuilder; } diff --git a/spring-integration-xml/src/main/resources/org/springframework/integration/xml/config/spring-integration-xml-5.0.xsd b/spring-integration-xml/src/main/resources/org/springframework/integration/xml/config/spring-integration-xml-5.0.xsd index e55a9a6b5a..e558f384d0 100644 --- a/spring-integration-xml/src/main/resources/org/springframework/integration/xml/config/spring-integration-xml-5.0.xsd +++ b/spring-integration-xml/src/main/resources/org/springframework/integration/xml/config/spring-integration-xml-5.0.xsd @@ -812,6 +812,18 @@ + + + + Reference to a custom 'org.springframework.integration.xml.XmlPayloadConverter' strategy + + + + + + + + diff --git a/spring-integration-xml/src/test/java/org/springframework/integration/xml/DefaultXmlPayloadConverterTests.java b/spring-integration-xml/src/test/java/org/springframework/integration/xml/DefaultXmlPayloadConverterTests.java index 0f5529ffc7..733dc4ba42 100644 --- a/spring-integration-xml/src/test/java/org/springframework/integration/xml/DefaultXmlPayloadConverterTests.java +++ b/spring-integration-xml/src/test/java/org/springframework/integration/xml/DefaultXmlPayloadConverterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 the original author or authors. + * Copyright 2002-2017 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. @@ -41,7 +41,6 @@ import org.xml.sax.InputSource; import org.springframework.core.io.ClassPathResource; import org.springframework.messaging.MessagingException; -import org.springframework.xml.transform.StringSource; /** * @@ -105,7 +104,7 @@ public class DefaultXmlPayloadConverterTests { @Test public void testGetSourcePassingString() throws Exception { Source source = converter.convertToSource(TEST_DOCUMENT_AS_STRING); - assertEquals(StringSource.class, source.getClass()); + assertEquals(DOMSource.class, source.getClass()); } @Test diff --git a/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XmlPayloadValidatingFilterParserTests-context.xml b/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XmlPayloadValidatingFilterParserTests-context.xml index e24024eb2e..c970eb1bc1 100644 --- a/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XmlPayloadValidatingFilterParserTests-context.xml +++ b/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XmlPayloadValidatingFilterParserTests-context.xml @@ -1,11 +1,11 @@ xml-schema - + + + + + - + diff --git a/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XmlPayloadValidatingFilterParserTests.java b/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XmlPayloadValidatingFilterParserTests.java index d0a984a45d..5ef31da6df 100644 --- a/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XmlPayloadValidatingFilterParserTests.java +++ b/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XmlPayloadValidatingFilterParserTests.java @@ -26,6 +26,9 @@ import static org.junit.Assert.fail; import java.util.List; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + import org.hamcrest.Matchers; import org.junit.Test; import org.junit.runner.RunWith; @@ -40,6 +43,7 @@ import org.springframework.integration.support.SmartLifecycleRoleController; import org.springframework.integration.test.util.TestUtils; import org.springframework.integration.xml.AggregatedXmlMessageValidationException; import org.springframework.integration.xml.util.XmlTestUtil; +import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.PollableChannel; import org.springframework.messaging.support.GenericMessage; @@ -60,6 +64,19 @@ import org.springframework.util.MultiValueMap; @DirtiesContext public class XmlPayloadValidatingFilterParserTests { + public static final DocumentBuilderFactory DOCUMENT_BUILDER_FACTORY = DocumentBuilderFactory.newInstance(); + + static { + DOCUMENT_BUILDER_FACTORY.setNamespaceAware(true); + try { + DOCUMENT_BUILDER_FACTORY.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false); + DOCUMENT_BUILDER_FACTORY.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); + } + catch (ParserConfigurationException e) { + throw new RuntimeException(e); + } + } + @Autowired private ApplicationContext ac; @@ -79,10 +96,10 @@ public class XmlPayloadValidatingFilterParserTests { @Test public void testValidMessage() throws Exception { - Document doc = XmlTestUtil.getDocumentForString("hello"); - GenericMessage docMessage = new GenericMessage(doc); - PollableChannel validChannel = ac.getBean("validOutputChannel", PollableChannel.class); - MessageChannel inputChannel = ac.getBean("inputChannelA", MessageChannel.class); + Message docMessage = + new GenericMessage<>("hello"); + PollableChannel validChannel = this.ac.getBean("validOutputChannel", PollableChannel.class); + MessageChannel inputChannel = this.ac.getBean("inputChannelA", MessageChannel.class); inputChannel.send(docMessage); assertNotNull(validChannel.receive(100)); } @@ -98,6 +115,7 @@ public class XmlPayloadValidatingFilterParserTests { assertNotNull(invalidChannel.receive(100)); assertNull(validChannel.receive(100)); } + @Test public void testInvalidMessageWithThrowException() throws Exception { Document doc = XmlTestUtil.getDocumentForString(""); @@ -117,6 +135,7 @@ public class XmlPayloadValidatingFilterParserTests { Matchers.containsString("Element 'greeting' is a simple type, so it cannot have attributes,")); } } + @Test public void testValidMessageWithValidator() throws Exception { Document doc = XmlTestUtil.getDocumentForString("hello"); diff --git a/src/reference/asciidoc/xml.adoc b/src/reference/asciidoc/xml.adoc index 7c0759b845..d291863c56 100644 --- a/src/reference/asciidoc/xml.adoc +++ b/src/reference/asciidoc/xml.adoc @@ -1033,8 +1033,9 @@ Please see below for an overview of all available configuration parameters: schema-location="" <5> schema-type="xml-schema" <6> throw-exception-on-rejection="false" <7> - xml-validator=""> <8> - <9> + xml-converter="" <8> + xml-validator=""> <9> + <10> ---- @@ -1069,10 +1070,11 @@ If not set it defaults to `xml-schema` which internally translates to `org.sprin <7> If `true` a `MessageRejectedException` is thrown in case validation fails for the provided Message's payload._Optional_. Defaults to `false` if not set. +<8> Reference to a custom `org.springframework.integration.xml.XmlPayloadConverter` strategy. +_Optional_. -<8> Reference to a custom `sorg.springframework.xml.validation.XmlValidator` strategy. +<9> Reference to a custom `sorg.springframework.xml.validation.XmlValidator` strategy. You can set this attribute or the `schema-location` attribute but not both. _Optional_. - -<9> _Optional_. +<10> _Optional_.