Skip to content

Guice7 Module usage with XmlMapper and JsonMapper concurrently #265

@mattbaumann

Description

@mattbaumann

I've an application where I need to use the XmlMapper and JsonMapper in the same global guice injector. Therefore I need a way to distinguish between those two mappers. I know of two options here: (1) I could make use of @Named("xml") and ObjectMapper superclass to distinguish between them. Yet, (2) I like to use the type safe variant by defining the relevant subclasses (JsonMapper, XmlMapper) with Guice. I decided to go with the second route as this allows me to make use of type checking and has a generally easier Guice interfacing.

Unfortunately, in combination with Guice7 Module this requires to do the following messy initialization:

final var jsonKey = (Key<ObjectMapper>) Key.get(JsonMapper.class).ofType((Type) JsonMapper.class);
final var jsonMapper = JsonMapper.builder()
        .addModule(new JavaTimeModule())
        .build();
final var xmlKey = (Key<ObjectMapper>) Key.get(XmlMapper.class).ofType((Type) XmlMapper.class);
final var xmlMapper = XmlMapper.builder()
        .addModule(new JavaTimeModule())
        .build();
Guice.createInjector(
       new ObjectMapperModule(jsonKey).withObjectMapper(jsonMapper),
       new ObjectMapperModule(xmlKey)..withObjectMapper(xmlMapper));

Since the new ObjectMapperModule(jsonKey) constructor only allows keys of type Key<ObjectMapper> without subclass types it forces me to do ugly type and casting Magic. Therefore I propose to add a constructor to ObjectMapperModule with a definition like Key<? extends ObjectMapper>:

public ObjectMapperModule(Key<? extends ObjectMapper> objectMapperKey)
  {
      ...
  }

Which would lead to the following API:

var injector = Guice.createInjector(new ObjectMapperModule(Key.get(XmlMapper.class)).withObjectMapper(xmlMapper));
XmlMapper mapper = injector.getInstance(XmlMapper.class);

Metadata

Metadata

Assignees

No one assigned

    Labels

    2.19pr-welcomeIssue for which progress most likely if someone submits a Pull Request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions