- Reusing Helidon SE services
This guide shows how reuse Helidon SE Service in your Helidon MP application.
What You Need
For this 10 minute tutorial, you will need the following:
| A Helidon {upper-case-flavor} Application | You can use your own application or use the Helidon {upper-case-flavor} Quickstart to create a sample application. |
| Java SE 11 (Open JDK 11) | Helidon requires Java 11+. |
| Maven 3.6.1+ | Helidon requires Maven 3.6.1+. |
| Docker 18.09+ | You need Docker if you want to build and deploy Docker containers. |
| Kubectl 1.16.5+ | If you want to deploy to Kubernetes, you need kubectl and a Kubernetes cluster (you can install one on your desktop). |
Verify Prerequisites
java -version
mvn --version
docker --version
kubectl version --shortcontent_copy
Setting JAVA_HOME
# On Mac
export JAVA_HOME=`/usr/libexec/java_home -v 11`
# On Linux
# Use the appropriate path to your JDK
export JAVA_HOME=/usr/lib/jvm/jdk-11content_copy
Helidon MP supports Reactive routing which brings possibility for reusing io.helidon.webserver.Service implementations in Helidon MP. Such feature can be quite useful for common solutions for filtering, auditing, logging or augmenting REST endpoints in hybrid Helidon SE/MP environment.
Let’s define simple Helidon SE Service for adding special header to every REST response:
public class CoolingService implements Service, Handler {
public static final String COOL_HEADER_NAME = "Cool-Header";
public static final String COOLING_VALUE = "This is way cooler response than ";
@Override
public void update(Routing.Rules rules) {
rules.any(this);
}
@Override
public void accept(ServerRequest req, ServerResponse res) {
res.headers().add(COOL_HEADER_NAME, COOLING_VALUE);
req.next();
}
}content_copy
Its easy to use it with Helidon SE:
WebServer.builder(Routing.builder()
// register service with routing path
.register("/cool", new CoolingService())
.build())
.config(config)
.addMediaSupport(JsonpSupport.create())
.build()
.start();content_copy
And not much harder to use it with Helidon MP:
@ApplicationScoped
public class MyBean {
@Produces
@ApplicationScoped
@RoutingPath("/cool")
public Service coolService() {
return new CoolingService();
}
}content_copy
You can leverage annotations:
@RoutingPath - path of the WebServer service
@RoutingName - select routing when serving requests on multiple ports