Spring获取泛型类型类

6

我知道这个问题经常被问到,但我找不到解决方法。在Spring注入的存储库中,如何获取通用类型类名?

这是我的基本存储库:

public interface UserRepository extends JpaRepository<User, Long>, IUserRepository<User>{
   User findByUsername(String username);
}

这是接口。

public interface IUserRepository<T> {
   public List<T> findAllValidEtSiteAndStructure();
}

最终,这就是实现过程

public class UserRepositoryImpl<T> implements IUserRepository<T> {

@PersistenceContext
private EntityManager em;

private Class< T > type;

@Override
public List<T> findAllValidEtSiteAndStructure() {
    final Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    if (authentication instanceof UserAuthentication) {
        final User currentUser = ((UserAuthentication) authentication).getDetails();
        return (List<T>) em.createQuery("FROM " + type.getName()+ " WHERE site=:site AND structure=:structure AND valid=:valid")
                .setParameter("site", currentUser.getInstallation().getSite())
                .setParameter("structure", currentUser.getInstallation().getStructure())
                .setParameter("valid", true)
                .getResultList();
    }
    return null;
}
}

如何获取type.name?
谢谢您的提问。
3个回答

12

考虑到您正在使用Spring Framework,使用下面的代码片段,我已经测试过了,它可以正常工作:

ResolvableType resolvableType = ResolvableType.forClass(UserRepository.class).as(JpaRepository.class);
System.out.println(resolvableType.getGeneric(0));//User
System.out.println(resolvableType.getGeneric(1));//Long

4
基本上,由于类型擦除,您无法获得通用类型。
我会添加一个抽象方法到中,以返回相关类型。
public abstract Class getType();

然后我将为UserRepositoryImpl创建特定的实例,这个类型在编译时已经知道。例如:

public class StudentRepository extends UserRepositoryImpl<Student> {
  public Class getType() {
    return Student.class;
  }
}

2
您的问题的一般答案可以在文档中找到 -> http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.custom-implementations 的章节“Spring Data存储库的自定义实现”。但我认为,在您的情况下,这应该是不必要的。您应该能够按以下方式完成。
public interface UserRepository extends JpaRepository<User, Long> {

   User findByUsername(String username);

   List<User> findByStructureAndSiteAndValid(Structure structure, Site site, boolean valid);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接