Я пытаюсь создать общий класс DAO для узлов графа в neo4j. У меня есть несколько классов графа узлов. Один из которых выглядит так
import org.neo4j.ogm.annotation.GeneratedValue;
import org.neo4j.ogm.annotation.Id;
import org.neo4j.ogm.annotation.Relationship;
public class Skill {
@Id @GeneratedValue
private Long id;
private String Name;
private String CleanedText;
public final static String GraphIdentifier = "skill-ontology";
@Relationship(type = "BelongsTo", direction = Relationship.OUTGOING)
private Set<SkillSubCluster> belongsTo = new HashSet<>();
public Long getId() {
return id;
}
public String getName() {
return Name;
}
public String getCleanedText() {
return CleanedText;
}
}
и мой класс GenericDAO -
public class NodeDAO<T> {
private static final int DEPTH_LIST = 0;
private static final int DEPTH_ENTITY = 1;
final Class<T> typeParameterClass;
private Session session;
public NodeDAO(Session session, Class<T> typeParameterClass) {
this.session = session;
this.typeParameterClass = typeParameterClass;
}
public NodeDAO(Session session) {
this.session = session;
this.typeParameterClass = getEntityClass();
}
public Class<T> getEntityClass() {
ParameterizedType parameterizedType = (ParameterizedType) getClass()
.getGenericSuperclass();
@SuppressWarnings("unchecked")
Class<T> ret = (Class<T>) parameterizedType.getActualTypeArguments()[0];
return ret;
}
protected Class<T> getEntityType() {
return (Class<T>) this.typeParameterClass;
}
public Iterable<T> findAll() {
return session.loadAll(getEntityType(), DEPTH_LIST);
}
// rest of the implementation
}
и затем у меня есть класс менеджера, который отвечает за подключение к нескольким экземплярам графа, чей единственный метод -
public <T> NodeDAO<T> getGraphNodeDAO(String graphDBIdentifier, Class<T> typeParameterClass){
// graphSessions is a hashmap<String, Session> storing multiple neo4j instances sessions. A session is identified by a graphDBIdentifier string
Session session = graphSessions.get(graphDBIdentifier);
// This works
NodeDAO<T> nodeDAO = new NodeDAO<T>(session, typeParameterClass);
//NodeDAO<T> nodeDAO = new NodeDAO<T>(session);
return nodeDAO;
}
Этот метод вызывается для получения объекта DAO для данного узла графа
NodeDAO<Skill> skillNodeDAO = manager.getGraphNodeDAO(Skill.GraphIdentifier, Skill.class);
Код работает нормально, но я хочу, чтобы класс менеджера getGraphNodeDAO
автоматически определял, какой сеанс загружать на основе проходов класса (на основе переменной класса GraphIdentifier
класса Skill
)
и NodeDAO
класс для автоматической идентификации class type
самостоятельно с необходимостью явной его передачи.
Invoking NodeDAO<T> nodeDAO = new NodeDAO<T>(session);
выдает следующую ошибку
Exception in thread "main" java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType