Skip to content

Build Custom Connector: JavaBean Action/Trigger

When to use: custom logic inside your service (SDKs, DB drivers, bespoke code) without writing a new transport.

Manifest

"execution": { "type": "javaBean", "beanName": "myHandler" }

SDK

dispatcher.registerActionHandler("myHandler", (c, in) -> Map.of("ok", true));
dispatcher.executeAction(manifest, "myOp", ctx, Map.of());

Trigger variant

Register the same bean as a trigger handler:

dispatcher.registerTriggerHandler("myHandler", (c, cfg) -> Flux.just(Map.of("tick", 1)));
dispatcher.startTrigger(manifest, "myOp", ctx, Map.of());

Full example (action)

Manifest (src/main/resources/manifests/hello.json):

{
  "schemaVersion": "1.0.0",
  "id": "demo.hello",
  "version": "1.0.0",
  "operations": { "sayHello": { "$ref": "#/operationDefs/sayHello" } },
  "operationDefs": {
    "sayHello": {
      "operationId": "sayHello",
      "kind": "action",
      "inputSchema": { "type": "object", "properties": { "name": { "type": "string" } } },
      "outputSchema": { "type": "object" },
      "execution": { "type": "javaBean", "beanName": "helloConnector" }
    }
  }
}

Handler (HelloConnector.java):

@Component("helloConnector")
public class HelloConnector extends AbstractActionHandler<Map<String,Object>, Map<String,Object>> {
    @Override
    protected Map<String,Object> doExecute(ConnectorContext ctx, Map<String,Object> input) {
        String name = String.valueOf(input.getOrDefault("name", "world"));
        return Map.of("greeting", "Hello " + name);
    }
}

Pipeline usage (inside a stage):

{
  "$set": {
    "greeting": {
      "$enrich": {
        "connectionRef": "demo.hello",
        "connectorId": "demo.hello",
        "operationId": "sayHello",
        "input": { "name": "$user.name" }
      }
    }
  }
}

Full example (action)

Manifest (src/main/resources/manifests/hello.json):

{
  "schemaVersion": "1.0.0",
  "id": "demo.hello",
  "version": "1.0.0",
  "operations": { "sayHello": { "$ref": "#/operationDefs/sayHello" } },
  "operationDefs": {
    "sayHello": {
      "operationId": "sayHello",
      "kind": "action",
      "inputSchema": { "type": "object", "properties": { "name": { "type": "string" } } },
      "outputSchema": { "type": "object" },
      "execution": { "type": "javaBean", "beanName": "helloConnector" }
    }
  }
}

Handler (HelloConnector.java):

@Component("helloConnector")
public class HelloConnector extends AbstractActionHandler<Map<String,Object>, Map<String,Object>> {
    @Override
    protected Map<String,Object> doExecute(ConnectorContext ctx, Map<String,Object> input) {
        String name = String.valueOf(input.getOrDefault("name", "world"));
        return Map.of("greeting", "Hello " + name);
    }
}

Pipeline usage (expression inside $set):

{
  "$set": {
    "greeting": {
      "$enrich": {
        "connectionRef": "demo.hello",
        "connectorId": "demo.hello",
        "operationId": "sayHello",
        "input": { "name": "$user.name" }
      }
    }
  }
}