我有一个SpringBoot 2.2.6 use应用程序,客户要求我使用spring-integration-http作为端点。
现在,我的目标是能够分析@Transformers。
例如,如果我设计一个interface,如下所示:
public interface CommonTransformer {
public Integer transform(AObject t, @Header String some);
public Integer transform(BObject t, @Header String some);
}还有这样的一门课:
@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();
}
}以及以下端点:
@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,只需将接口指定为端点参数即可。
例如,这允许我创建另一个实现,如:
@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);
}
}这种分析对于我正在开发的项目是至关重要的,但是如果我有两个这样的端点:
@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参数。因此,问题是我是否可以拥有这样的接口:
public interface CommonTransformer {
public Integer transformA(AObject t, @Header String some, Other params);
public Integer transformB(BObject t, @Header String some);
.......
other methods
}在这一点上,有几个分析实现并以某种方式调用了适当的方法:
@Bean
public IntegrationFlow test(CommonTransformer transformer) {
.....
.....
.transform(transformer::transformA) // or something like that??
}显然,我希望将我丰富的标题(或使用#pathVariables或#requestParams表达式设置)传递给该方法。
也许这个问题(以及我编写的代码)看起来很傻,但我对spring-integration完全陌生,我必须在很短的时间内做这么多事情。
任何帮助都是非常感谢的。
发布于 2022-07-02 17:30:31
对不起,我们没有看到您的requestPayloadType(Integer.class)与某些CommonTransformer方法之间的相关性:看起来您不像是有一个基于Integer类型的方法。请详细说明您希望为/api/test调用什么以及为/api/test2调用什么。
该方法由有效负载类型从具有如下合同的消息中选择:
公共接口消息{
/**
* 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,并使用以下变体:
.transform(Message.class, transformer::transformA)它必须看起来像这样:
Integer transformA(Message<AObject> message);https://stackoverflow.com/questions/72839824
复制相似问题