Проверка типа пути критерия JPA - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть класс CollectionCriterion, определенный следующим образом:

public class CollectionCriterion<E>
    ...
    //this is a standard JPA path expression to a field (for instance field1.field2.field3
    private String pathExpression;
    //this is the entity class
    private Class<?> entityClass
    ...

    public void validateField() throws IllegalStateException {
        ...
        //here I retrieve the field corresponding to the path expression
        //for instance I retrieve the field country corresponding to the
        //path "person.address.country"
        Field field = JpaUtils.navigateTo(entityClass, pathExpression);

        //here I have to check that the retrieved field is a Collection
        //of elements of type E (Collection<E>)
        if(!Collection.class.isAssignableFrom(field.getType())) {
            throw new IllegalArgumentException(...);
        }
        else {
            //if it's a collection check if it contains only
            //instances of E
        }

        ...
    }
}

Учитывая следующий класс сущности:

@Entity
public class A {
    ...
    private Collection<String> collection;
    ...
}

Я могу получить java.lang.String аргумент типа из поля collectionиспользуя java отражение:

Field field = A.class.getDeclaredField("collection");
ParameterizedType fieldType = (ParameterizedType) field.getGenericType();
Class<?> fieldTypeParameter = (Class<?>) fieldType.getActualTypeArguments()[0]; //here i get java.lang.String class.

Как я могу получить параметр типа E из CollectionCriterion<E>, чтобы сравнить его с параметром типа поля?

Мне известно о стирании типа ввремя выполнения ( здесь из stackoverflow ), но я нашел следующие инструменты, которые могут извлекать параметры универсального типа: TypeToken , Typetools и Classmate .И я не хочу, чтобы клиент передавал Class<E> в качестве аргумента конструктора CollectionCriterion<E>.

Спасибо за ваше время.

...