diff --git a/spring-integration-http/src/main/java/org/springframework/integration/http/HttpRequestExecutingMessageHandler.java b/spring-integration-http/src/main/java/org/springframework/integration/http/HttpRequestExecutingMessageHandler.java index ce5835896d..081ba9355c 100755 --- a/spring-integration-http/src/main/java/org/springframework/integration/http/HttpRequestExecutingMessageHandler.java +++ b/spring-integration-http/src/main/java/org/springframework/integration/http/HttpRequestExecutingMessageHandler.java @@ -16,9 +16,7 @@ package org.springframework.integration.http; -import java.net.MalformedURLException; import java.net.URI; -import java.net.URL; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -47,7 +45,7 @@ import org.springframework.web.client.RestTemplate; */ public class HttpRequestExecutingMessageHandler extends AbstractReplyProducingMessageHandler { - private final String defaultUri; + private final String uri; private volatile HttpMethod defaultHttpMethod = HttpMethod.POST; @@ -61,30 +59,18 @@ public class HttpRequestExecutingMessageHandler extends AbstractReplyProducingMe /** - * Create an adapter that has no default URI. Any Message sent to this handler will be - * required to contain a valid value for the {@link HttpHeaders#REQUEST_URL} header. + * Create a handler that will send requests to the provided URI. */ - public HttpRequestExecutingMessageHandler() { - this((String) null); + public HttpRequestExecutingMessageHandler(URI uri) { + this(uri.toString()); } /** - * Create an HttpOutboundEndpoint that will send requests to the provided - * URI by default. If a Message contains a valid value for the - * {@link HttpHeaders#REQUEST_URL} header, that will take precedence. + * Create a handler that will send requests to the provided URI. */ - public HttpRequestExecutingMessageHandler(URI defaultUri) { - this(defaultUri.toString()); - } - - /** - * Create an HttpOutboundEndpoint that will send requests to the provided - * URI by default. If a Message contains a valid value for the - * {@link HttpHeaders#REQUEST_URL} header, that will take precedence. - */ - public HttpRequestExecutingMessageHandler(String defaultUri) { + public HttpRequestExecutingMessageHandler(String uri) { this.restTemplate.getMessageConverters().add(0, new SerializingHttpMessageConverter()); - this.defaultUri = defaultUri; + this.uri = uri; } @@ -150,9 +136,7 @@ public class HttpRequestExecutingMessageHandler extends AbstractReplyProducingMe @Override protected Object handleRequestMessage(Message requestMessage) { - String uri = null; try { - uri = this.resolveUri(requestMessage); HttpMethod httpMethod = this.resolveHttpMethod(requestMessage); // TODO: allow a boolean flag for treating Map as queryParams vs. uriVariables? Map uriVariables = this.determineUriVariables(requestMessage); @@ -160,7 +144,7 @@ public class HttpRequestExecutingMessageHandler extends AbstractReplyProducingMe if (!isWritableRequestMethod(httpMethod) && httpRequest.getBody() != null) { httpRequest = new HttpEntity(null, httpRequest.getHeaders()); } - ResponseEntity httpResponse = this.restTemplate.exchange(uri, httpMethod, httpRequest, this.expectedResponseType, uriVariables); + ResponseEntity httpResponse = this.restTemplate.exchange(this.uri, httpMethod, httpRequest, this.expectedResponseType, uriVariables); if (this.expectReply) { Object responseBody = httpResponse.getBody(); MessageBuilder replyBuilder = (responseBody instanceof Message) ? @@ -173,7 +157,7 @@ public class HttpRequestExecutingMessageHandler extends AbstractReplyProducingMe throw e; } catch (Exception e) { - throw new MessageHandlingException(requestMessage, "HTTP request execution failed for URI [" + uri + "]", e); + throw new MessageHandlingException(requestMessage, "HTTP request execution failed for URI [" + this.uri + "]", e); } } @@ -184,32 +168,6 @@ public class HttpRequestExecutingMessageHandler extends AbstractReplyProducingMe } } - /** - * Resolve the request URL for the given Message. This implementation - * returns the value associated with the {@link HttpHeaders#REQUEST_URL} - * key if available in the Message's headers. Otherwise, it falls back to - * the default URI as provided to the constructor of this handler instance. - * @throws MalformedURLException if an error occurs while constructing the URL - */ - private String resolveUri(Message message) throws MalformedURLException { - Object urlHeader = message.getHeaders().get(HttpHeaders.REQUEST_URL); - if (urlHeader == null) { - Assert.notNull(this.defaultUri, - "No request URL header available in request Message, and no default has been provided."); - return this.defaultUri; - } - if (urlHeader instanceof URL) { - return ((URL) urlHeader).toString(); - } - if (urlHeader instanceof URI) { - return ((URI) urlHeader).toString(); - } - if (urlHeader instanceof String) { - return (String) urlHeader; - } - throw new IllegalArgumentException("Target URL in Message header must be a URL, URI, or String."); - } - private HttpMethod resolveHttpMethod(Message requestMessage) { HttpMethod httpMethod = null; Object methodFromMessage = requestMessage.getHeaders().get(HttpHeaders.REQUEST_METHOD); diff --git a/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpOutboundGatewayParser.java b/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpOutboundGatewayParser.java index e558b553f6..897ec289ac 100644 --- a/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpOutboundGatewayParser.java +++ b/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpOutboundGatewayParser.java @@ -22,7 +22,6 @@ import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.integration.config.xml.AbstractConsumerEndpointParser; import org.springframework.integration.config.xml.IntegrationNamespaceUtils; -import org.springframework.util.StringUtils; /** * Parser for the 'outbound-gateway' element of the http namespace. @@ -43,44 +42,16 @@ public class HttpOutboundGatewayParser extends AbstractConsumerEndpointParser { protected BeanDefinitionBuilder parseHandler(Element element, ParserContext parserContext) { BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition( PACKAGE_PATH + ".HttpRequestExecutingMessageHandler"); - String defaultUrl = element.getAttribute("default-url"); - if (StringUtils.hasText(defaultUrl)) { - builder.addConstructorArgValue(defaultUrl); - } - String charset = element.getAttribute("charset"); - String extractPayload = element.getAttribute("extract-request-payload"); - String requestMapperRef = element.getAttribute("request-mapper"); - if (StringUtils.hasText(requestMapperRef)) { - if (StringUtils.hasText(charset)) { - this.requestMapperConflictError("charset", parserContext, element); - return null; - } - if (StringUtils.hasText(extractPayload)) { - this.requestMapperConflictError("extract-request-payload", parserContext, element); - return null; - } - builder.addPropertyReference("requestMapper", requestMapperRef); - } - else { - BeanDefinitionBuilder mapperBuilder = BeanDefinitionBuilder.genericBeanDefinition( - PACKAGE_PATH + ".DefaultOutboundRequestMapper"); - if (StringUtils.hasText(charset)) { - mapperBuilder.addPropertyValue("charset", charset); - } - if (StringUtils.hasText(extractPayload)) { - mapperBuilder.addPropertyValue("extractPayload", extractPayload); - } - builder.addPropertyValue("requestMapper", mapperBuilder.getBeanDefinition()); - } + builder.addConstructorArgValue(element.getAttribute("url")); + BeanDefinitionBuilder mapperBuilder = BeanDefinitionBuilder.genericBeanDefinition( + PACKAGE_PATH + ".DefaultOutboundRequestMapper"); + IntegrationNamespaceUtils.setValueIfAttributeDefined(mapperBuilder, element, "charset"); + IntegrationNamespaceUtils.setValueIfAttributeDefined(mapperBuilder, element, "extract-request-payload", "extractPayload"); + builder.addPropertyValue("requestMapper", mapperBuilder.getBeanDefinition()); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "request-timeout", "sendTimeout"); IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "request-factory"); IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "reply-channel", "outputChannel"); return builder; } - private void requestMapperConflictError(String nameForGateway, ParserContext parserContext, Element element) { - parserContext.getReaderContext().error("The '" + nameForGateway + "' and 'request-mapper' are mutually exclusive. " + - "When providing an OutboundRequestMapper, set any corresponding property on the mapper directly.", element); - } - } diff --git a/spring-integration-http/src/main/resources/org/springframework/integration/http/config/spring-integration-http-2.0.xsd b/spring-integration-http/src/main/resources/org/springframework/integration/http/config/spring-integration-http-2.0.xsd index 90cf080d5b..916abb4588 100644 --- a/spring-integration-http/src/main/resources/org/springframework/integration/http/config/spring-integration-http-2.0.xsd +++ b/spring-integration-http/src/main/resources/org/springframework/integration/http/config/spring-integration-http-2.0.xsd @@ -158,7 +158,7 @@ - + URL to be used as a fallback for any request Message does not contain the request URL Message header. @@ -167,15 +167,6 @@ - - - - - - - - - diff --git a/spring-integration-http/src/test/java/org/springframework/integration/http/config/DefaultConfigurationTests-context.xml b/spring-integration-http/src/test/java/org/springframework/integration/http/config/DefaultConfigurationTests-context.xml index a8e69f387a..7ae15cfcde 100644 --- a/spring-integration-http/src/test/java/org/springframework/integration/http/config/DefaultConfigurationTests-context.xml +++ b/spring-integration-http/src/test/java/org/springframework/integration/http/config/DefaultConfigurationTests-context.xml @@ -7,6 +7,6 @@ http://www.springframework.org/schema/integration/http http://www.springframework.org/schema/integration/http/spring-integration-http.xsd"> - + diff --git a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParserTests.java b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParserTests.java index 8934450558..bc144d767d 100644 --- a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParserTests.java +++ b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParserTests.java @@ -68,7 +68,7 @@ public class HttpOutboundChannelAdapterParserTests { assertTrue(mapper instanceof DefaultOutboundRequestMapper); assertTrue(requestFactory instanceof SimpleClientHttpRequestFactory); DirectFieldAccessor mapperAccessor = new DirectFieldAccessor(mapper); - assertEquals("http://localhost/test1", handlerAccessor.getPropertyValue("defaultUri")); + assertEquals("http://localhost/test1", handlerAccessor.getPropertyValue("uri")); assertEquals("UTF-8", mapperAccessor.getPropertyValue("charset")); assertEquals(true, mapperAccessor.getPropertyValue("extractPayload")); } @@ -92,7 +92,7 @@ public class HttpOutboundChannelAdapterParserTests { Object requestFactoryBean = this.applicationContext.getBean("testRequestFactory"); assertEquals(requestFactoryBean, requestFactory); DirectFieldAccessor mapperAccessor = new DirectFieldAccessor(mapper); - assertEquals("http://localhost/test2", handlerAccessor.getPropertyValue("defaultUri")); + assertEquals("http://localhost/test2", handlerAccessor.getPropertyValue("uri")); assertEquals("UTF-8", mapperAccessor.getPropertyValue("charset")); assertEquals(false, mapperAccessor.getPropertyValue("extractPayload")); } diff --git a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundGatewayParserTests-context.xml b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundGatewayParserTests-context.xml index 242efacead..af9e57380a 100644 --- a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundGatewayParserTests-context.xml +++ b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundGatewayParserTests-context.xml @@ -12,36 +12,23 @@ - + - - - - - - - - diff --git a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundGatewayParserTests.java b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundGatewayParserTests.java index 130faf3220..0df15b4ea0 100644 --- a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundGatewayParserTests.java +++ b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundGatewayParserTests.java @@ -18,7 +18,6 @@ package org.springframework.integration.http.config; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @@ -49,11 +48,8 @@ public class HttpOutboundGatewayParserTests { @Autowired @Qualifier("minimalConfig") private AbstractEndpoint minimalConfigEndpoint; - @Autowired @Qualifier("fullConfigWithMapper") - private AbstractEndpoint fullConfigWithMapperEndpoint; - - @Autowired @Qualifier("fullConfigWithoutMapper") - private AbstractEndpoint fullConfigWithoutMapperEndpoint; + @Autowired @Qualifier("fullConfig") + private AbstractEndpoint fullConfigEndpoint; @Autowired private ApplicationContext applicationContext; @@ -75,20 +71,18 @@ public class HttpOutboundGatewayParserTests { templateAccessor.getPropertyValue("requestFactory"); assertTrue(mapper instanceof DefaultOutboundRequestMapper); assertTrue(requestFactory instanceof SimpleClientHttpRequestFactory); - Object mapperBean = this.applicationContext.getBean("testMapper"); - assertNotSame(mapperBean, mapper); DirectFieldAccessor mapperAccessor = new DirectFieldAccessor(mapper); - assertNull(handlerAccessor.getPropertyValue("defaultUri")); + assertEquals("http://localhost/test1", handlerAccessor.getPropertyValue("uri")); assertEquals("UTF-8", mapperAccessor.getPropertyValue("charset")); assertEquals(true, mapperAccessor.getPropertyValue("extractPayload")); } @Test - public void fullConfigWithMapper() throws Exception { - DirectFieldAccessor endpointAccessor = new DirectFieldAccessor(this.fullConfigWithMapperEndpoint); + public void fullConfig() throws Exception { + DirectFieldAccessor endpointAccessor = new DirectFieldAccessor(this.fullConfigEndpoint); HttpRequestExecutingMessageHandler handler = (HttpRequestExecutingMessageHandler) endpointAccessor.getPropertyValue("handler"); MessageChannel requestChannel = (MessageChannel) new DirectFieldAccessor( - this.fullConfigWithMapperEndpoint).getPropertyValue("inputChannel"); + this.fullConfigEndpoint).getPropertyValue("inputChannel"); assertEquals(this.applicationContext.getBean("requests"), requestChannel); DirectFieldAccessor handlerAccessor = new DirectFieldAccessor(handler); assertEquals(77, handlerAccessor.getPropertyValue("order")); @@ -102,40 +96,8 @@ public class HttpOutboundGatewayParserTests { templateAccessor.getPropertyValue("requestFactory"); assertTrue(mapper instanceof DefaultOutboundRequestMapper); assertTrue(requestFactory instanceof SimpleClientHttpRequestFactory); - Object mapperBean = this.applicationContext.getBean("testMapper"); - assertEquals(mapperBean, mapper); DirectFieldAccessor mapperAccessor = new DirectFieldAccessor(mapper); - assertEquals("http://localhost/test1", handlerAccessor.getPropertyValue("defaultUri")); - assertEquals("UTF-8", mapperAccessor.getPropertyValue("charset")); - assertEquals(false, mapperAccessor.getPropertyValue("extractPayload")); - Object requestFactoryBean = this.applicationContext.getBean("testRequestFactory"); - assertEquals(requestFactoryBean, requestFactory); - Object sendTimeout = new DirectFieldAccessor( - handlerAccessor.getPropertyValue("channelTemplate")).getPropertyValue("sendTimeout"); - assertEquals(new Long("1234"), sendTimeout); - } - - @Test - public void fullConfigWithoutMapper() throws Exception { - HttpRequestExecutingMessageHandler handler = (HttpRequestExecutingMessageHandler) new DirectFieldAccessor( - this.fullConfigWithoutMapperEndpoint).getPropertyValue("handler"); - MessageChannel requestChannel = (MessageChannel) new DirectFieldAccessor( - this.fullConfigWithoutMapperEndpoint).getPropertyValue("inputChannel"); - assertEquals(this.applicationContext.getBean("requests"), requestChannel); - DirectFieldAccessor handlerAccessor = new DirectFieldAccessor(handler); - Object replyChannel = handlerAccessor.getPropertyValue("outputChannel"); - assertNotNull(replyChannel); - assertEquals(this.applicationContext.getBean("replies"), replyChannel); - OutboundRequestMapper mapper = (OutboundRequestMapper) handlerAccessor.getPropertyValue("requestMapper"); - DirectFieldAccessor templateAccessor = new DirectFieldAccessor(handlerAccessor.getPropertyValue("restTemplate")); - ClientHttpRequestFactory requestFactory = (ClientHttpRequestFactory) - templateAccessor.getPropertyValue("requestFactory"); - assertTrue(mapper instanceof DefaultOutboundRequestMapper); - assertTrue(requestFactory instanceof SimpleClientHttpRequestFactory); - Object mapperBean = this.applicationContext.getBean("testMapper"); - assertNotSame(mapperBean, mapper); - DirectFieldAccessor mapperAccessor = new DirectFieldAccessor(mapper); - assertEquals("http://localhost/test2", handlerAccessor.getPropertyValue("defaultUri")); + assertEquals("http://localhost/test2", handlerAccessor.getPropertyValue("uri")); assertEquals("UTF-8", mapperAccessor.getPropertyValue("charset")); assertEquals(false, mapperAccessor.getPropertyValue("extractPayload")); Object requestFactoryBean = this.applicationContext.getBean("testRequestFactory");