Spring Integration using gateways makes it possible to consume services from multiple sources and expose them as api's . API's can be exposed with or without further processing . Lets look at an example without Processing .
If you need a code ref you can find it here https://github.com/arun2dot0/spring-integration-example
getFoo is a Restful service consumed by Spring and exposes back as service .
First thing to define is the publish-subscribe-channel ,then configure the input-channel with all the mappings .Example shows the method getFoo but there can be many mappings added for each of the service .
Next step is to specify the gateway to accept the incoming request to the channel . Service interface with the list of interface methods is specified .
Finally the http-oubound gateway is defined with the url , http-method with the transformer.
Transformer can be easily implemented by json-to-object trasnfromation as show.
Update :
It can be done using Java DSL as well and you can find the implementation here
https://github.com/arun2dot0/spring-integration-example-dsl
DSL uses newer version of spring integration and http library .
Spring Configuration
Java Code
Gateway Service
Response
If you need a code ref you can find it here https://github.com/arun2dot0/spring-integration-example
getFoo is a Restful service consumed by Spring and exposes back as service .
First thing to define is the publish-subscribe-channel ,then configure the input-channel with all the mappings .Example shows the method getFoo but there can be many mappings added for each of the service .
Next step is to specify the gateway to accept the incoming request to the channel . Service interface with the list of interface methods is specified .
Finally the http-oubound gateway is defined with the url , http-method with the transformer.
Transformer can be easily implemented by json-to-object trasnfromation as show.
Update :
It can be done using Java DSL as well and you can find the implementation here
https://github.com/arun2dot0/spring-integration-example-dsl
DSL uses newer version of spring integration and http library .
Spring Configuration
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:int="http://www.springframework.org/schema/integration"
xmlns:http="http://www.springframework.org/schema/integration/http"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/integration/http http://www.springframework.org/schema/integration/http/spring-integration-http-2.1.xsd
http://www.springframework.org/schema/integration
http://www.springframework.org/schema/integration/spring-integration-2.1.xsd">
<!-- Channel for incoming request-->
<int:publish-subscribe-channel id="pubsubChannel"></int:publish-subscribe-channel>
<!-- Define header with all the necessary mapping-->
<int:header-value-router input-channel="pubsubChannel" header-name="REQUEST_TYPE">
<int:mapping value="getFoo" channel="getFooChannel"/>
</int:header-value-router>
<int:channel id="getFooChannel"/>
<!-- Simple facade method which accepts messages into channel -->
<int:gateway id="firstGatewayID" service-interface="services.api.FirstGatewayService" default-request-channel="pubsubChannel" >
<!--Provide method in the gateway -->
<int:method name="getFoo">
<int:header name="REQUEST_TYPE" value="getFoo"/>
</int:method>
</int:gateway>
<!--outbound gateway to get data from url-->
<http:outbound-gateway id="getFooGateway"
url="http://somehost.com/GetFoo"
request-channel="getFooChannel"
reply-channel="getFooChannel_response"
http-method="GET"
expected-response-type="java.lang.String">
</http:outbound-gateway>
<int:json-to-object-transformer input-channel="getFooChannel_response" type="model.FooResponse"/>
</beans>
Java Code
Gateway Service
package services.api;
import org.springframework.integration.annotation.Header;
import org.springframework.integration.annotation.Payload;
public interface FirstGatewayService {
@Payload("new java.util.Date()")
public FooResponse getFoo();
}
Response
package model;
import org.codehaus.jackson.annotate.JsonProperty;
public class FooResponse {
@JsonProperty("status")
boolean status;
@JsonProperty("data")
String data;
public boolean isStatus() {
return status;
}
public void setStatus(boolean status) {
this.status = status;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
Controller
@Autowired
private FirstGatewayService gatewayService;
@Override
@RequestMapping(value = <url to access>, method = RequestMethod.GET)
public @ResponseBody BaseResponse getFoo() {
return gatewayService.getFoo();
}
3 comments:
Very great tutorial, i've been looking for this entire week, but i'm a bit confuse in configuration. Can I have the source code of this particular project? Or link for github? Thank you..
The prefix "http" for element "http:outbound-gateway" is not bound.
This is what i get when i copy paste your xml code please help me
Http schema URL was missing and its fixed now
Post a Comment