Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Jackson create JavaType from Class

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?

like image 379
cambunctious Avatar asked Mar 25 '20 14:03

cambunctious


2 Answers

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.
like image 88
Michał Ziober Avatar answered Nov 18 '22 14:11

Michał Ziober


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);
like image 36
Philippe Simo Avatar answered Nov 18 '22 16:11

Philippe Simo