spring Integration,in outbound-gateway want to use URL as dynamic like
<bean id="requestValues" class="com.src.model.RequestValues"/>
<int-http:outbound-gateway
request-channel="reqChannel" url="${UrlValue}"
http-method="${reqmethod}" expected-response-type="java.lang.String" header-mapper="headerMapper"
charset="UTF-8" reply-timeout="5000" reply-channel="responseChannel" >
<int-http:uri-variable name="UrlValue" expression="#{requestValues.getUrl()}" />
<int-http:uri-variable name="reqmethod" expression="#{requestValues.getReqMethod()}" />
</int-http:outbound-gateway>
Here Requestvalues is simple POJO it like
@Data
public class Requestvalues {
public String Url;
public String reqMethod;
}
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler#0': Cannot create inner bean '(inner bean)#6ea2bc93' of type [org.springframework.integration.config.ExpressionFactoryBean] while setting bean property 'uriVariableExpressions' with key [url]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#6ea2bc93': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.integration.config.ExpressionFactoryBean]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: expressionString must not be empty or null
The
http-method
is not part of the URI; it does not support or useuri-variables
.Use
http-method-expression="payload.reqMethod"
instead.Similarly,
Accept
is not part of the uri - set the Accept header in the outbound message, it will be mapped.EDIT
You are confusing runtime expressions with bean declaration expressions and, as I said, you need to use method expression if you want a runtime method selection.
However, since you are using a bean for your
Requestvalues
you don't need runtime expressions at all.If you want to select the method and url at runtime, based on the message, you would use something like...
Where the headers are set dynamically somewhere upstream, or
Notice the use of
@
to refer to beans in runtime expressions.You can set meta data like URL or http method as headers. You can even use Spring EL when setting the header, f.e.
and then use an expression for the outbound gateway