JAVA Component

Using the JAVA component to run Java code.

The JAVA component allows you to run java code in the standalone version of API Express.

Java

You can read more about Java by the following url https://en.wikipedia.org/wiki/Java_(programming_language)
Pay attention that standalone version of API Express uses 8 version of Java so it is recommended to use the same or lower version.

Java Properties

In the JAVA SERVICE section, you can set:

  • Java lib
  • Class name
    In the REQUEST BODY section, you can set:
    JavaScript expression and value of requestBody will be passed as the input parameter in Java component

Libs

The JAVA component expects that invoking Java class implements io.appery.apiexpress.components.JavaComponent interface

package io.appery.apiexpress.components;

import com.fasterxml.jackson.databind.node.ContainerNode;

public interface JavaComponent {
    ContainerNode execute(ContainerNode objectNode);
}

JavaComponent interface has only execute method which accepts ContainerNode object and returns ContainerNode in other words like all API Express components Java component accepts Json object and returns Json object.

Reference Java project with implementation JavaComponent interface is available in git https://github.com/apperyio/apiexpress-java-component

Main class of reference project is JavaComponentImpl

package io.appery.apiexpress.components;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ContainerNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

public class JavaComponentImpl implements JavaComponent {
    public ContainerNode execute(ContainerNode containerNode) {

        ObjectMapper mapper = new ObjectMapper();
        ObjectNode result = mapper.createObjectNode();

        result.put("name", containerNode.get("name").textValue());
        result.put("age", 20);

        return result;
    }
}

JavaComponentImpl expects that input json object contains field with name "name", take value of this field, create new json object with fields name and age.

Reference project contains unit test class JavaComponentTest. It is not essential to create unit class but it is a good practice.

package io.appery.apiexpress.components.tests;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.appery.apiexpress.components.JavaComponentImpl;
import org.junit.Assert;
import org.junit.Test;

public class JavaComponentTest {

    @Test
    public void testExample() {
        ObjectMapper mapper = new ObjectMapper();
        ObjectNode objectNode = mapper.createObjectNode();
        objectNode.put("name", "alex");

        ObjectNode result = (ObjectNode)new JavaComponentImpl().execute(objectNode);
        
        Assert.assertEquals(result.get("name").textValue(), "alex");
        Assert.assertEquals(result.get("age").asInt(), 20);
    }
}

To build a .jar file the mvn package command needs to be run. Pom file of reference project contains all required dependencies and plugin to build proper .jar file.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>io.appery.apiexpress.components</groupId>
    <artifactId>java</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <jackson.version>2.7.6</jackson.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.version}</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>io.appery.apiexpress</groupId>
            <artifactId>java-component-interface</artifactId>
            <version>1.0.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/repo/io/appery/apiexpress/1.0.0/java-component-interface-1.0.0.jar</systemPath>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

maven-shade-plugin plugin copies all class files from dependencies in a result .jar file (which is available after package command in target repository) so result jar file is self-sufficient.

After building .jar file it can be upload in API Expres on the Libs tab.

Example

To run the reference project

  • clone project from git repository
  • run mvn package file
  • upload java-1.0-SNAPSHOT.jar file from target repository and provide name (for example JavaImpl)
  • Create new custom service with only one Java component
  • Specify properties: Java lib: JavaImpl and Class name: io.appery.apiexpress.components.JavaComponentImpl
  • Specify REQUEST BODY as requestBody = {"name": "test"};
  • Save and test service