I have a SpringBoot 2.2.6
webapp and the customer ask me to use spring-integration-http
for the endpoint.
Now, my goal is to be able to profiling @Transformers
.
For example if I design an interface
like follow:
public interface CommonTransformer {
public Integer transform(AObject t, @Header String some);
public Integer transform(BObject t, @Header String some);
}
And a class like follow:
@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();
}
}
And the following endpoint:
@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();
}
This way, if I call the first or the second endpoint the correct @Transformer
will be called just specifying the interface as endpoint parameter.
This allow me to create for example another implementation like:
@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);
}
}
This kind of profiling is vital for the project I'm developing, but if I have two endpoint like this:
@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();
}
The trick doesn't work because they have the same Integer
parameter within the payload.
Therefore the question is can I have an interface like:
public interface CommonTransformer {
public Integer transformA(AObject t, @Header String some, Other params);
public Integer transformB(BObject t, @Header String some);
.......
other methods
}
Several profiled implementation and calling the appropriate method in some way at this point:
@Bean
public IntegrationFlow test(CommonTransformer transformer) {
.....
.....
.transform(transformer::transformA) // or something like that??
}
Clearly I want to pass to the method the payload the headers I enriched (or setted with #pathVariables
or #requestParams
expression).
Maybe the question (and the code I have written) may seem dummy but I'm absolutely new to spring-integration
and I have to do so much thing in a very short time..
Any help is appreciated.