Pere Miquel Brull 34fbe5d64c
Docs - Prepare 1.7 docs and 1.8 snapshot (#20882)
* DOCS - Prepare 1.7 Release and 1.8 SNAPSHOT

* DOCS - Prepare 1.7 Release and 1.8 SNAPSHOT
2025-04-18 12:12:17 +05:30

5.5 KiB

title slug
Create the Java ClassConverter /developers/contribute/developing-a-new-connector/create-java-class-converter

Create the Java ClassConverter

If and only if you had to use the oneOf property type on your connector's JSON Schema you also need to implement a Java ClassConverter to be able to instantiate the correct class from the configuration.

Without this, Java doesn't know the proper Class to instantiate and it wouldn't work as expected.

{% note %} This is necessary even if you are indirectly using a oneOf property by referencing another JSON Schema that uses it. {% /note %}

Implementing your ClassConverter

In order to implement the ClassConverter you need to create a new file within

openmetadata-service/src/main/java/org/openmetadata/service/secrets/converter

There you should create a new public class that extends ClassConverter. The easiest way to achieve this is to use another ClassConverter as a reference.

Example - MysqlConnectionClassConverter.java

Here we will see how to create a ClassConverter for the MysqlConnection, where we define the authType using the oneOf attribute.

{% note %} The file will be shortened and parts of it will be replaced with ... for readability. {% /note %}

{% codePreview %}

{% codeInfoContainer %}

{% codeInfo srNumber=1 %}

Before anything else you need to remember to import the needed classes.

In this example we need to import the MysqlConnection itself and both the IamAuthConfig and basicAuth. It is important to remember that this classes are generated from the JSON Schema and can be found within openmetadata-spec/target/classes/org/openmetadata/schema/services/connections.

If you remember from Define the JSON Schema, the MysqlConnection uses oneOf to define the authType property:

    ...
    "authType": {
      "title": "Auth Configuration Type",
      "description": "Choose Auth Config Type.",
      "oneOf": [
        {
          "$ref": "./common/basicAuth.json"
        },
        {
          "$ref": "./common/iamAuthConfig.json"
        }
      ]
    },
    ...

{% /codeInfo %}

{% codeInfo srNumber=2 %}

With the needed imports in place, now it is time to extend the ClassConverter class to create the MysqlConnectionClassConverter.

We are overriding the convert method and going the following:

  1. Creating a MysqlConnection instance from the json object received
  2. Getting the AuthType configuration and trying to use it to instantiate either a basicAuth or a IamAuthConfig. The first success will be returned.
  3. We set the AuthType to be this newly instantaited class
  4. We return the MysqlConnection instance.

{% /codeInfo %}

{% /codeInfoContainer %}

{% codeBlock fileName="DatabaseServiceUtils.ts" %}

...
package org.openmetadata.service.secrets.converter;

import java.util.List;
import org.openmetadata.schema.services.connections.database.MysqlConnection;
import org.openmetadata.schema.services.connections.database.common.IamAuthConfig;
import org.openmetadata.schema.services.connections.database.common.basicAuth;
import org.openmetadata.service.util.JsonUtils;

/** Converter class to get an `MysqlConnectionClassConverter` object. */
public class MysqlConnectionClassConverter extends ClassConverter {

  private static final List<Class<?>> CONFIG_SOURCE_CLASSES =
      List.of(basicAuth.class, IamAuthConfig.class);

  public MysqlConnectionClassConverter() {
    super(MysqlConnection.class);
  }

  @Override
  public Object convert(Object object) {
    MysqlConnection mysqlConnection = (MysqlConnection) JsonUtils.convertValue(object, this.clazz);

    tryToConvert(mysqlConnection.getAuthType(), CONFIG_SOURCE_CLASSES)
        .ifPresent(mysqlConnection::setAuthType);

    return mysqlConnection;
  }
}

{% /codeBlock %} {% /codePreview %}

Making your ClassConverter visible

Now that your ClassConverter is implemented you need to add it to the ClassconverterFactory.java file, located in the same path.

Example - MysqlConnectionClassconverter

{% note %} The file will be shortened and parts of it will be replaced with ... for readability. {% /note %}

{% codePreview %}

{% codeInfoContainer %}

{% codeInfo srNumber=3 %}

Before anything else you need to remember to import your ClassConverter

{% /codeInfo %}

{% codeInfo srNumber=4 %}

Now you just need to add a new Map.entry to the converterMap.

{% /codeInfo %}

{% /codeInfoContainer %}

{% codeBlock fileName="DatabaseServiceUtils.ts" %}

...
import org.openmetadata.schema.services.connections.database.MysqlConnection;
...
public final class ClassConverterFactory {
  ...
  static {
    converterMap =
        Map.ofEntries(
            ...
            Map.entry(MysqlConnection.class, new MysqlConnectionClassConverter()));
  }
  ...
}

{% /codeBlock %} {% /codePreview %}

Next Step

Now that the code is ready, let's learn how to test it!

{%inlineCallout color="violet-70" bold="Test It" icon="MdArrowForward" href="/developers/contribute/developing-a-new-connector/test-it"%} Learn how to test your new connector! {%/inlineCallout%}