Вы можете создать статический метод для десериализации объекта с универсальным типом
public class MyDeserializer {
private static final ObjectMapper objectMapper = new ObjectMapper();
public static <T> T convertValue(String content, Class<T> contentClass) throws IOException {
Assert.notNull(content, "Content cannot be null");
Assert.notNull(contentClass, "Content class must be specified");
return objectMapper.readValue(content, contentClass);
}
}
и проверить ваш метод:
Color color = MyDeserializer.convertValue("{" +
"\"nameValue\":\"red\"," +
"\"hexValue\":\"FFFFFF\"" + "}", Color.class);
assertEquals("red", color.getNameValue());
assertEquals("FFFFFF", color.getHexValue());
Таким образом, вы можете использовать десериализатор длялюбой класс во время выполнения.
ОБНОВЛЕНИЕ
Чтобы ваш пример работал, вам нужно удалить перед getContent совпадение с универсальным типом T из класса.
public T getContent() throws IOException {
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue(content, responseClass);
}
и для использования вашего метода:
responseModel.setContent("{" +
"\"nameValue\":\"red\"," +
"\"hexValue\":\"FFFFFF\"" + "}");
responseModel.setResponseClass(Color.class);
Во время выполнения универсальный тип заменяется на Object, поэтому вы должны указать ожидаемый класс.
Я все еще считаю, что первое решениечистый.Вы спрашиваете, возможно ли вывести класс T, но невозможно увидеть тип T во время выполнения.