Spring集成出站网关希望像动态一样使用URL

时间:2017-10-03 08:16:21

标签: java spring spring-integration

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

2 个答案:

答案 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。