-
Notifications
You must be signed in to change notification settings - Fork 82
Description
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);