Skip to content

Commit

Permalink
Document ways of customizing ObjectMapper for JacksonDataFormat
Browse files Browse the repository at this point in the history
Fixes #3921
  • Loading branch information
jamesnetherton committed Jul 21, 2022
1 parent 21ae731 commit e40ff05
Show file tree
Hide file tree
Showing 2 changed files with 150 additions and 0 deletions.
77 changes: 77 additions & 0 deletions docs/modules/ROOT/pages/reference/extensions/jackson.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,80 @@ Or add the coordinates to your existing project:
----

Check the xref:user-guide/index.adoc[User guide] for more information about writing Camel Quarkus applications.

== Usage

=== Configuring the Jackson `ObjectMapper`

There are a few ways of configuring the `ObjectMapper` that the `JacksonDataFormat` uses. These are outlined below.

==== `ObjectMapper` created internally by `JacksonDataFormat`

By default, `JacksonDataFormat` will create its own `ObjectMapper` and use the various configuration options on the `DataFormat`
to configure additional Jackson modules, pretty printing and other features.

==== Custom `ObjectMapper` for `JacksonDataFormat`

You can pass a custom `ObjectMapper` instance to `JacksonDataFormat` as follows.

[source,java]
----
ObjectMapper mapper = new ObjectMapper();
JacksonDataFormat dataFormat = new JacksonDataFormat();
dataFormat.setObjectMapper(mapper);
----

==== Using the Quarkus Jackson `ObjectMapper` with `JacksonDataFormat`

The Quarkus Jackson extension exposes an `ObjectMapper` CDI bean which can be discovered by the `JacksonDataFormat`.

[source,java]
----
ObjectMapper mapper = new ObjectMapper();
JacksonDataFormat dataFormat = new JacksonDataFormat();
// Make JacksonDataFormat discover the Quarkus Jackson `ObjectMapper` from the Camel registry
dataFormat.setAutoDiscoverObjectMapper(true);
----

If you are using the JSON binding mode in the Camel REST DSL and want to use the Quarkus Jackson `ObjectMapper`, it can be achieved as follows.

[source,java]
----
@ApplicationScoped
public class Routes extends RouteBuilder() {
public void configure() {
restConfiguration().dataFormatProperty("autoDiscoverObjectMapper", "true");
// REST definition follows...
}
}
----

You can perform customizations on the Quarkus `ObjectMapper` with a `ObjectMapperCustomizer`.

[source,java]
----
@Singleton
public class RegisterCustomModuleCustomizer implements ObjectMapperCustomizer {
public void customize(ObjectMapper mapper) {
mapper.registerModule(new CustomModule());
}
}
----

It's also possible to `@Inject` the Quarkus `ObjectMapper` and pass it to the `JacksonDataFormat`.

[source,java]
----
@ApplicationScoped
public class Routes extends RouteBuilder() {
@Inject
ObjectMapper mapper;
public void configure() {
JacksonDataFormat dataFormat = new JacksonDataFormat();
dataFormat.setObjectMapper(mapper);
// Routes definition follows...
}
}
----

73 changes: 73 additions & 0 deletions extensions/jackson/runtime/src/main/doc/usage.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
=== Configuring the Jackson `ObjectMapper`

There are a few ways of configuring the `ObjectMapper` that the `JacksonDataFormat` uses. These are outlined below.

==== `ObjectMapper` created internally by `JacksonDataFormat`

By default, `JacksonDataFormat` will create its own `ObjectMapper` and use the various configuration options on the `DataFormat`
to configure additional Jackson modules, pretty printing and other features.

==== Custom `ObjectMapper` for `JacksonDataFormat`

You can pass a custom `ObjectMapper` instance to `JacksonDataFormat` as follows.

[source,java]
----
ObjectMapper mapper = new ObjectMapper();
JacksonDataFormat dataFormat = new JacksonDataFormat();
dataFormat.setObjectMapper(mapper);
----

==== Using the Quarkus Jackson `ObjectMapper` with `JacksonDataFormat`

The Quarkus Jackson extension exposes an `ObjectMapper` CDI bean which can be discovered by the `JacksonDataFormat`.

[source,java]
----
ObjectMapper mapper = new ObjectMapper();
JacksonDataFormat dataFormat = new JacksonDataFormat();
// Make JacksonDataFormat discover the Quarkus Jackson `ObjectMapper` from the Camel registry
dataFormat.setAutoDiscoverObjectMapper(true);
----

If you are using the JSON binding mode in the Camel REST DSL and want to use the Quarkus Jackson `ObjectMapper`, it can be achieved as follows.

[source,java]
----
@ApplicationScoped
public class Routes extends RouteBuilder() {
public void configure() {
restConfiguration().dataFormatProperty("autoDiscoverObjectMapper", "true");
// REST definition follows...
}
}
----

You can perform customizations on the Quarkus `ObjectMapper` with a `ObjectMapperCustomizer`.

[source,java]
----
@Singleton
public class RegisterCustomModuleCustomizer implements ObjectMapperCustomizer {
public void customize(ObjectMapper mapper) {
mapper.registerModule(new CustomModule());
}
}
----

It's also possible to `@Inject` the Quarkus `ObjectMapper` and pass it to the `JacksonDataFormat`.

[source,java]
----
@ApplicationScoped
public class Routes extends RouteBuilder() {
@Inject
ObjectMapper mapper;
public void configure() {
JacksonDataFormat dataFormat = new JacksonDataFormat();
dataFormat.setObjectMapper(mapper);
// Routes definition follows...
}
}
----

0 comments on commit e40ff05

Please sign in to comment.