spring集成,在出站网关中希望将URL用作动态像
<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>
此处Requestvalues是简单的POJO 它喜欢
@Data
public class Requestvalues {
public String Url;
public String reqMethod;
}
org.springframework.beans.factory.BeanCreationException:创建名为'org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler#0'的bean时出错:无法创建[org]类型的内部bean'(内部bean)#6ea2bc93' .springframework.integration.config.ExpressionFactoryBean]用键[url]设置bean属性'uriVariableExpressions';嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名为'(内部bean)#6ea2bc93'的bean时出错:通过构造函数的Bean实例化失败;嵌套异常是org.springframework.beans.BeanInstantiationException:无法实例化[org.springframework.integration.config.ExpressionFactoryBean]:构造函数抛出异常;嵌套异常是java.lang.IllegalArgumentException:expressionString不能为空或为null
答案 0 :(得分:3)
您可以将URL或http方法等元数据设置为标题。您甚至可以在设置标题时使用Spring EL,例如
<int:header-enricher>
<int:header name="url" value="${url.base}/reports/"/>
</int:header-enricher>
然后使用表达式作为出站网关
<int-http:outbound-gateway id='httpGateway'
url-expression="headers['url']"
...
/>
答案 1 :(得分:0)
http-method
不是URI的一部分;它不支持或使用uri-variables
。
改为使用http-method-expression="payload.reqMethod"
。
同样地,Accept
不是uri的一部分 - 在出站消息中设置Accept标头,它将被映射。
修改强>
您正在使用bean声明表达式混淆运行时表达式,正如我所说,如果您想要选择运行时方法,则需要使用方法表达式。
但是,由于您正在为Requestvalues
使用bean,因此根本不需要运行时表达式。
<int-http:outbound-gateway
request-channel="reqChannel" url="#{requestValues.getUrl()}"
http-method=""#{requestValues.getReqMethod()}" expected-response-type="java.lang.String" header-mapper="headerMapper"
charset="UTF-8" reply-timeout="5000" reply-channel="responseChannel" >
</int-http:outbound-gateway>
如果你想在运行时根据消息选择方法和网址,你会使用类似的东西......
<int-http:outbound-gateway
request-channel="reqChannel" url="${UrlValue}"
http-method-expression="headers['method']" 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="headers['url']" />
</int-http:outbound-gateway>
标题在上游某处动态设置,或
<int-http:outbound-gateway
request-channel="reqChannel" url="${UrlValue}"
http-method-expression="@requestValues.getReqMethod()" 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:outbound-gateway>
注意使用@
来引用运行时表达式中的bean。