关于如何将两个路径合并为多个变量的Spring Integration

时间:2019-07-30 13:42:58

标签: java spring-integration dsl spring-integration-dsl

我正在尝试找出如何为.payLoadExpression引入多个path变量,但是还没有找到实现该目标的方法。我还需要为.uriVariable做些事情吗?

这仅适用于一个.payloadExpression

@Bean
public IntegrationFlow getDrugsByIngredientWorkflow() {
  return IntegrationFlows
        .from(Http.inboundGateway("/drugsbyingcode/name/{name}")
        .payloadExpression("#pathVariables.name")
        .requestMapping(m -> m.methods(HttpMethod.GET))
        .errorChannel(IntegrationConfiguration.CHANNEL_ERROR_REST))
        .handle(Http.outboundGateway(url + "/" + "{name}")
        .charset("UTF-8")
        .httpMethod(HttpMethod.GET)
        .uriVariable("name", "payload")
        .expectedResponseType(DrugByIngredientResponse.class))
        .transform(DrugByIngredientResponse::getDrug)
        .get();
}

这不起作用

public IntegrationFlow getContraindicationsByDrugcodeAndIcd10WorkFlow() {
  return IntegrationFlows
         .from(Http.inboundGateway("/drug/{code}/icd10/{icd10}/contraindications")
         .payloadExpression("#pathVariables.code" + ',' + "#pathVariables.icd10")
         .requestMapping(m -> m.methods(HttpMethod.GET))
         .errorChannel(IntegrationConfiguration.CHANNEL_ERROR_REST))
         .handle(Http.outboundGateway(url + "/{code}/V22?format=json")
         .httpMethod(HttpMethod.GET)
         .uriVariable("code", "payload")
         .expectedResponseType(String.class))
         .get();
    }

3 个答案:

答案 0 :(得分:0)

“不起作用”对于这样的问题不是很有帮助;您需要准确描述您遇到的问题。

如果您使用更好的缩进方案以使代码更易于阅读,这也将有所帮助。

我们收到了很多这些问题,只有时间来浏览一下配置。

问题是您正在使用Java连接两个变量而不是SpEL:

@Bean
public IntegrationFlow getContraindicationsByDrugcodeAndIcd10WorkFlow() {
    return IntegrationFlows
            .from(Http.inboundGateway("/drug/{code}/icd10/{icd10}/contraindications")
                    .payloadExpression("#pathVariables.code + ',' + #pathVariables.icd10")
                    .requestMapping(m -> m.methods(HttpMethod.GET)))
            .handle(Http.outboundGateway(url + "/{code}/V22?format=json")
                    .httpMethod(HttpMethod.GET)
                    .uriVariable("code", "payload")
                    .expectedResponseType(String.class))
            .get();
}

结果

  

2019-07-31 09:17:06.210 DEBUG 36050 --- [nio-8080-exec-1] o.s.integration.channel.DirectChannel : preSend on channel ... message: GenericMessage [payload=fiz,buz, headers={http_requestMethod=GET, ...

您还可以将路径变量映射到消息头,并在下游uriVariables中使用它们。

使用您的版本,SpEL不知道如何处理逗号。

#foo,#bar

语法无效,必须是

#foo + ',' + #bar

答案 1 :(得分:0)

需要使用构造函数和getter / setters创建一个新类。.还请注意,您也可以在handle请求上定义两个.uriVariable

   public IntegrationFlow getContraindicationsByDrugcodeAndIcd10WorkFlow() {
       //new ContraindicationRequest("string", "string");
       return IntegrationFlows
               .from(Http.inboundGateway("/contraindicationsbydrugcodeandicd10/{code}/{icd10}")
                       .payloadExpression("new net.eir.nexus.model.dto.api.dit.request.ContraindicationRequest(#pathVariables.code, #pathVariables.icd10)")
                       .requestMapping(m -> m.methods(HttpMethod.GET))
                       .errorChannel(IntegrationConfiguration.CHANNEL_ERROR_REST)
               )
               `enter code here`///dit/contraindicationsbydrugcodes/1234567890/Y12319,Y20743/Z34,I10,E0810?icdtype=icd10&format=json
               .handle(Http.outboundGateway(url + "/{code}/{icd10}?icdtype=icd10&format=json")
                       .httpMethod(HttpMethod.GET)
                       .uriVariable("code", "payload.drugCode")
                       .uriVariable("icd10", "payload.icd10")
                       .expectedResponseType(ContraindicationsByDrugcodeAndIcd10Response.class))
                 .transform(ContraindicationsByDrugcodeAndIcd10Response::getAllergyIngredient)
               .get();


答案 2 :(得分:0)

关于如何做这么简单的事情,令人惊讶的是缺乏好的和有用的文档,这是显示在 Google 上的主要页面之一,实际上是唯一直接解决问题的页面之一,所以我将找到我花了很长时间才找到的解决方案,希望它能帮助其他正在寻找相同解决方案的人。

简而言之,使用 headerExpression() 而不是 payloadExpression()

@Bean
IntegrationFlow mySpringIntegrationEndpointMethod(
        EntityManagerFactory entityManagerFactory,
        DefaultHttpHeaderMapper headerMapper
) {
    return IntegrationFlows
            .from(Http.inboundGateway("/some/path/with/{my_var_1}/and/{my_var_2}")
                    .requestMapping(mapping -> mapping.methods(HttpMethod.GET))
                    .headerExpression("myVar1", "#pathVariables.my_var_1")
                    .headerExpression("myVar2", "#pathVariables.my_var_2")
                    .headerMapper(headerMapper)
                    .errorChannel("somechannel")
                    .get())
            .handle(Jpa.retrievingGateway(entityManagerFactory)
                    .nativeQuery("SELECT * FROM my_function(:myVar1, :myVar2)")
                    .parameterExpression("myVar1","new Integer(headers['myVar1'])")
                    .parameterExpression("myVar2", "new Integer(headers['myVar2'])"))
            .get();
}