Создание параметризованного Jackson Javatype во время выполнения из ссылки на типJAVA

Программисты JAVA общаются здесь
Anonymous
Создание параметризованного Jackson Javatype во время выполнения из ссылки на тип

Сообщение Anonymous »

Я пишу библиотеку обмена сообщениями JMS, где я хочу, чтобы абстрактный слушатель слушал для напечатанного события (или подтипа этого события). < /p>

Код: Выделить всё

public abstract class AbstractTypedEventHandler implements EventHandler {

@Getter
private final ObjectMapper handlerMapper;

@Getter
private final TypeReference type;

protected AbstractTypedEventHandler(TypeReference eventType) {
this(JsonMapper.builder().configure(MapperFeature.ALLOW_FINAL_FIELDS_AS_MUTATORS, false).build(),
eventType);
}

protected AbstractTypedEventHandler(ObjectMapper handlerMapper, TypeReference eventType) {
this.handlerMapper = handlerMapper;
this.type = eventType;
}

@Override
public boolean parseMessage(JsonNode text, Tracer tracer) throws IOException {
E event = handlerMapper.treeToValue(text, getType());

handleEvent(event)
}

public abstract boolean handleEvent(E event);

}
< /code>
Для удобства я написал еще один абстрактный обработчик для обработки основного использования использования основного наведите события: < /p>
public abstract class TypedEventHandler extends AbstractTypedEventHandler {

protected TypedEventHandler() {
super(new TypeReference() {});
}

protected TypedEventHandler(ObjectMapper mapper) {
super(mapper, new TypeReference() {});
}
}
Проблема с этим заключается в том, что во время выполнения, когда пользователь наследует обработчик: открытый класс Pojoeventhandler расширяет typedeventhandler из -за того, что генерики, выброшенные во время выполнения. LinkedHashmap

Код: Выделить всё

public class PojoEventHandler extends TypedEventHandler {

@Override
public boolean handleEvent(TypedEvent event) {
var pojo = event.getResource(); // throws
}
}
}
< /code>
Вот конкретная ошибка: < /p>
java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class a.b.c.service.Pojo (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; a.b.c.service.Pojo is in unnamed module of loader 'app')
at a.b.c.service.eventhandlers.PojoEventHandler.handleEvent(PojoEventHandler.java:38)
at a.b.c.service.eventhandlers.PojoEventHandler.handleEvent(PojoEventHandler.java:24)
at a.b.c.framework.common.EventHandler.executeHandler(EventHandler.java:57)
at a.b.c.framework.eventhandlers.AbstractTypedEventHandler.parseMessage(AbstractTypedEventHandler.java:83)
at a.b.c.framework.common.jms.JmsMessageHandler.onMessage(JmsMessageHandler.java:79)
...
Если вы проверяете время выполнения с помощью отладчика, вы можете увидеть, что Джексон фактически правильно понижает внешний тип как typedevent , но предоставляет общий LinkedHashmap для внутреннего типа. Jackson TypeFactory Чтобы добавить информацию о внутреннем классе в качестве прарамирированной ссылки во время выполнения? Typefactory.createParametizedType (...) , похоже, не принимает Typereference для любой из его перегрузки, только статический класс для внешнего типа. Есть ли другой обходной путь, который позволил бы мне добавить информацию о внутреннем типе, если я разработал библиотеку, чтобы попросить пользователя для класса ?


Подробнее здесь: https://stackoverflow.com/questions/797 ... -reference

Вернуться в «JAVA»