首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >呼叫弹簧积分变压器法

呼叫弹簧积分变压器法
EN

Stack Overflow用户
提问于 2022-07-02 14:27:37
回答 1查看 40关注 0票数 0

我有一个SpringBoot 2.2.6 use应用程序,客户要求我使用spring-integration-http作为端点。

现在,我的目标是能够分析@Transformers

例如,如果我设计一个interface,如下所示:

代码语言:javascript
复制
public interface CommonTransformer {
   public Integer transform(AObject t, @Header String some);

   public Integer transform(BObject t, @Header String some);
}

还有这样的一门课:

代码语言:javascript
复制
@Component
@Profile("unicredit")
public class TestTransformer implements CommonTransformer {
    
  @Override
  @Transformer
  public Integer transform(AObject t, @Header("case") String caso) {
    return t.getId();
  }

  @Override
  @Transformer
  public Integer transform(BObject t, @Header("case") String caso) {
    return t.getId();
  }
}

以及以下端点:

代码语言:javascript
复制
@Bean
public IntegrationFlow test(Jackson2JsonObjectMapper obj, CommonTransformer transformer) {
    return IntegrationFlows.from(Http.inboundGateway("/api/test/{id_a}/{id_b}")
            .requestMapping(m -> m.methods(HttpMethod.GET))
                .replyChannel("reply")
                .payloadExpression("new it.integration.http.bean.AObject(#pathVariables.id_a, #pathVariables.id_b)")
                .requestPayloadType(AObject.class))
            .enrichHeaders(h -> h.header("case", "test1"))
            .transform(transformer)
            .transform(new ObjectToJsonTransformer(obj))
            .channel("httpRequest")
            .get();
    
}

@Bean
public IntegrationFlow test2(Jackson2JsonObjectMapper obj, CommonTransformer transformer) {
    return IntegrationFlows.from(Http.inboundGateway("/api/test2/{id_b}")
            .requestMapping(m -> m.methods(HttpMethod.GET))
                .replyChannel("reply")
                .payloadExpression("new it.integration.http.bean.BObject(#pathVariables.id_b)")
                .requestPayloadType(BObject.class))
            .enrichHeaders(h -> h.header("case", "test2"))
            .transform(transformer)
            .transform(new ObjectToJsonTransformer(obj))
            .channel("httpRequest")
            .get();
    
}

这样,如果我调用第一个或第二个端点,将调用正确的@Transformer,只需将接口指定为端点参数即可。

例如,这允许我创建另一个实现,如:

代码语言:javascript
复制
@Component
@Profile("ubs")
public class TestTransformer implements CommonTransformer {

  UBSSOAPClient client;

  @Override
  @Transformer
  public Integer transform(AObject t, @Header("case") String caso) {
    Object obj = client.getSome();
    return someMapper.mapToAObject(obj);
  }

  @Override
  @Transformer
  public Integer transform(BObject t, @Header("case") String caso) {
    Object obj = client.getSome();
    return someMapper.mapToBObject(obj);
  }
}

这种分析对于我正在开发的项目是至关重要的,但是如果我有两个这样的端点:

代码语言:javascript
复制
@Bean
public IntegrationFlow test(Jackson2JsonObjectMapper obj, CommonTransformer transformer) {
    return IntegrationFlows.from(Http.inboundGateway("/api/test/{id}")
            .requestMapping(m -> m.methods(HttpMethod.GET))
                .replyChannel("reply")
                .payloadExpression("#pathVariables.id)
                .requestPayloadType(Integer.class))
            .transform(transformer)
            .transform(new ObjectToJsonTransformer(obj))
            .channel("httpRequest")
            .get();
}

@Bean
public IntegrationFlow test(Jackson2JsonObjectMapper obj, CommonTransformer transformer) {
    return IntegrationFlows.from(Http.inboundGateway("/api/test2/{id}")
            .requestMapping(m -> m.methods(HttpMethod.GET))
                .replyChannel("reply")
                .payloadExpression("#pathVariables.id)
                .requestPayloadType(Integer.class))
            .transform(transformer)
            .transform(new ObjectToJsonTransformer(obj))
            .channel("httpRequest")
            .get();
}

这个技巧不起作用,因为它们在有效负载中具有相同的Integer参数。因此,问题是我是否可以拥有这样的接口:

代码语言:javascript
复制
public interface CommonTransformer {
 public Integer transformA(AObject t, @Header String some, Other params);

 public Integer transformB(BObject t, @Header String some);
 .......
 other methods
}

在这一点上,有几个分析实现并以某种方式调用了适当的方法:

代码语言:javascript
复制
@Bean
public IntegrationFlow test(CommonTransformer transformer) {
     .....
     .....
     .transform(transformer::transformA) // or something like that??
}

显然,我希望将我丰富的标题(或使用#pathVariables#requestParams表达式设置)传递给该方法。

也许这个问题(以及我编写的代码)看起来很傻,但我对spring-integration完全陌生,我必须在很短的时间内做这么多事情。

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 2022-07-02 17:30:31

对不起,我们没有看到您的requestPayloadType(Integer.class)与某些CommonTransformer方法之间的相关性:看起来您不像是有一个基于Integer类型的方法。请详细说明您希望为/api/test调用什么以及为/api/test2调用什么。

该方法由有效负载类型从具有如下合同的消息中选择:

公共接口消息{

代码语言:javascript
复制
/**
 * Return the message payload.
 */
T getPayload();

/**
 * Return message headers for the message (never {@code null} but may be empty).
 */
MessageHeaders getHeaders();

}

因此,如果没有@Header (或@Payload),您将如何使用params并不重要,所有这些参数都只能使用来自该消息的有效负载填充。是的:如果类型不匹配,则分别转换。

您可以使用方法引用,但它必须与GenericTransformer合同相匹配。并访问标题,您需要将输入作为一个整体Message,并使用以下变体:

代码语言:javascript
复制
.transform(Message.class, transformer::transformA)

它必须看起来像这样:

代码语言:javascript
复制
Integer transformA(Message<AObject> message);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72839824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档