我会复制 我的回答在这里,因为它与另一个类似的问题相同:
根据我最近的经验,我认为在Spring Boot中的某些类或接口中进行反射是有必要的。
正如@ekcrisp在类似问题的回答中所说:
您可以使用Spring的GenericTypeResolver从Repository中获取实体类。
我的经验:不幸的是,常见的反射方式无法在Spring Boot的repository中获取<T>
实体类。我尝试了很多种方法。但是这个GenericTypeResolver
确实可以从JpaRepository<T, ID>
中获取泛型<T>
类型。
换句话说,下面的函数可以将类的所有泛型类型作为数组提供。然后您可以选择其中之一:
public Class<?>[] getGenericType( Class<?> classInstance, Class<?> classToGetGenerics ) {
return GenericTypeResolver.resolveTypeArguments( classInstance, classToGetGenerics );
}
本答案涉及以下堆栈及其版本:
JDK 11,Spring Boot 2.7.11与Spring MVC,Spring Data JPA和其他库。发布于2023年5月11日。
如果您想在本地“ObjectUtil”解决方案中添加一个解决方案,也许这些方法可以帮助您获取任何位置的通用类型,例如在
JpaRepository<T, ID>
中获取
<T>
或
<ID>
:
@UtilityClass
public class ObjectUtil {
public static Class<?>[] getGenericType( Class<?> classInstance, Class<?> classToGetGenerics ) {
return GenericTypeResolver.resolveTypeArguments( classInstance, classToGetGenerics );
}
public static Class<?> getGenericType( Class<?> classInstance, Class<?> classToGetGenerics, int genericPosition ) {
Class<?>[] typeArguments = getGenericType( classInstance, classToGetGenerics );
if( typeArguments != null && typeArguments.length >= genericPosition ) {
return typeArguments[genericPosition];
}
throw new IllegalArgumentException( "Could not determine generic type for interface " + classInstance.getName() );
}
}
因此,我们可以像下面的示例一样使用(我创建了一个QueryUtil来专门处理持久性问题):
@UtilityClass
public class QueryUtil {
public static Class<?> getRepositoryEntityType( Class<?> repositoryClass ) {
return ObjectUtil.getGenericType( repositoryClass, Repository.class, 0 );
}
}
希望这仍然有用。 这里它被用于由方面制作的定制审计逻辑,以便对实体进行审计。
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected end of subtree [select 'SampleEnumeration']
- tkralik