Jackson create JavaType from Class
Asked Answered
B

2

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?

Breana answered 25/3, 2020 at 14:2 Comment(0)
T
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.
Turnstone answered 6/4, 2020 at 15:23 Comment(0)
S
13

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);
Sebiferous answered 1/11, 2020 at 15:28 Comment(1)
Yeah. Hmm. Didn't realize Class is Type.Breana

© 2022 - 2024 — McMap. All rights reserved.