Available in versions: Dev (3.20) | Latest (3.19) | 3.18

Context Converter

Applies to ✅ Open Source Edition   ✅ Express Edition   ✅ Professional Edition   ✅ Enterprise Edition

The previous section discussed the generic data type conversion API represented by the org.jooq.Converter type. Unlike org.jooq.Binding, a Converter does not get access to a org.jooq.Configuration in any way, and as such, makes dependency injection of third party logic into converters difficult. A common use-case is to implement a Jackson based converter for JSON processing, and to configure that Jackson ObjectMapper somewhere. With Converter, the only ways to do this include:

  • Creating a static global variable somewhere and accessing that.
  • Resorting to java.lang.ThreadLocal usage, before executing a query.

Both of these options are certainly viable, but don't feel right. This is why a new org.jooq.ContextConverter has been introduced, a subtype of the org.jooq.Converter, exposing additional methods:

// A ContextConverter can be used wherever a Converter can be used
public interface ContextConverter<T, U> extends Converter<T, U> {

    // Additional, specialised from(T):U and to(U):T methods receive a ConverterContext type,
    // which gives access to your Configuration from within the ContextConverter
    U from(T databaseObject, ConverterContext ctx);
    T to(U userObject, ConverterContext ctx);

    // The usual Converter methods don't have to be implemented and won't be called by
    // jOOQ internals, if you're implementing ContextConverter. The default implementation
    // uses an unspecified, internal ConverterContext
    @Override
    default T to(U userObject) {
        return to(userObject, converterContext());
    }

    @Override
    default U from(T databaseObject) {
        return from(databaseObject, converterContext());
    }
}

If you provide jOOQ with an org.jooq.ContextConverter, then jOOQ will guarantee that the more specialised from() and to() methods are called, which are receiving a org.jooq.converterContext, which provides access to the ubiquitous org.jooq.Configuration. In order to provide your ContextConverter with custom configuration, just use Configuration::data:

// Configuring your Configuration, e.g. with Spring:
Configuration configuration = new DefaultConfiguration();
configuration.data("my-configuration-key", myConfigurationValue);

// And then:
public class MyContextConverter implements ContextConverter<Integer, String> {
    @Override
    public String from(Integer databaseObject, ConverterContext ctx) {
        if (ctx.configuration().data("my-configuration-key") != null)
            return "configuration enabled";
        else
            return "configuration disabled";
    }
}

Feedback

Do you have any feedback about this page? We'd love to hear it!

The jOOQ Logo