10

There must be a way to create a JavaType from String.class?

Note: The input for the method must be JavaType for my use case because that value is created dynamically using TypeFactory.

/** Returns a JavaType for Map<String, valueType> **/
private static JavaType stringToJavaType(JavaType valueType) {
    TypeFactory typeFactory = objectMapper.getTypeFactory();
    // this does not compile, can't mix Class and JavaType
    return typeFactory.constructMapType(Map.class, String.class, valueType);
}

If I may tack on a related question, what is the advantage of constructMapType over constructParametricType?

Michał Ziober
  • 37,175
  • 18
  • 99
  • 146
cambunctious
  • 8,391
  • 5
  • 34
  • 53

2 Answers2

13

You can do it by:

  • constructFromCanonical method. For example: typeFactory.constructFromCanonical(String.class.getName())
  • constructType method. For example: typeFactory.constructType(new TypeReference<String>() {}).
  • constructArrayType method. For example: typeFactory.constructArrayType(String.class).getContentType(). But it looks a little bit like a workaround.
  • SimpleType.constructUnsafe method. For example: SimpleType.constructUnsafe(String.class). Note from documentation: Method used by core Jackson classes: NOT to be used by application code: it does NOT properly handle inspection of super-types, so neither parent Classes nor implemented Interfaces are accessible with resulting type instance. So, even it is possible to use try to avoid it.
Michał Ziober
  • 37,175
  • 18
  • 99
  • 146
12

If you are here just because you want to create a JavaType from a Class object,
then use an ObjectMapper like so:

   JavaType javaType = objectMapper.constructType(clazz);
Philippe Simo
  • 1,353
  • 1
  • 15
  • 28