有没有办法提取所有Repositories
以及他们提供的Class<T>
?
我有一些Repositories
使用限定符注释:
@NetworkDataProvider
@Repository
public interface SwitchRepository extends CrudRepository<Switch, SwitchPK>
他们提供的bean使用元数据进行注释,元数据定义了它们在GUI中的显示方式:
@Entity
@Table(...)
public class Switch implements Serializable {
@Column(name = "switch_name")
@NotNull
@UIName(value = "name of switch")
@UIPrio(value = 2)
private String name;
现在我必须提取所有存储库及其相应的类:
@Autowired
@NetworkDataProvider
List<Repository<?>> repositories;
public List<RepositoryClassTuple> getAllNetworkDataProvider() {
return repositories.map(r ->
new RepositoryClassTuple(r, /* how to do this */ r.getProidedClass())).asList();
}
有没有办法做到这一点?我真的需要存储库提供的数据bean的注释。
答案 0 :(得分:3)
您可以定义界面:
public interface NetworkRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
Class<T> getType();
}
然后你可以定义你的实现:
public interface PersonRepository extends NetworkRepository<Person, Long> {
@Override
default Class<Person> getType() {
return Person.class;
}
}
public interface AnimalRepository extends NetworkRepository<Animal, Long> {
@Override
default Class<Animal> getType() {
return Animal.class;
}
}
然后把它们全部拿走:
@Autowired
Collection<NetworkRepository> networkRepositories;
最后,您可以使用getType()
方法获取课程信息。
重要事项:您必须在NetworkRepository
无法扫描的软件包中声明Spring Data
。
答案 1 :(得分:2)
您可以创建名为MyRepository
的界面public interface MyRepository{
}
然后,所有存储库类都必须实现您的接口:
@Repository("foo")
public class FooExample implements MyRepository{
}
@Repository("bar")
public class BarExample implements MyRepository{
}
最后,您可以注入MyRepository bean的映射:
@Component
public class ExampleConsumer {
private final Map<String, MyRepository> repositories;
@Autowired
public ExampleConsumer(Map<String, MyRepository> repositories) {
this.examples = examples;
}
}
在这种情况下,地图将包含两个条目:
&#34;富&#34; - &GT; FooExample实例
&#34;杆&#34; - &GT; BarExample实例
另一种方法是使用java Reflection来读取注释
Class aClass = TheClass.class;
Annotation annotation = aClass.getAnnotation(MyAnnotation.class);
if(annotation instanceof MyAnnotation){
MyAnnotation myAnnotation = (MyAnnotation) annotation;
System.out.println("name: " + myAnnotation.name());
System.out.println("value: " + myAnnotation.value());
}
这里有一个教程
http://tutorials.jenkov.com/java-reflection/annotations.html
答案 2 :(得分:2)
Spring Data有一个名为Repositories
的类型,它带有ListableBeanFactory
,然后可用于检查存储库:
Repositories repositories = new Repositories(beanFactory);
for (Class<?> domainType : repositories) {
RepositoryInformation info = repositories.getRepositoryInformationFor(domainType);
…
}
我仍然想知道为什么你需要搞砸这种低级别的东西。真正的应用程序代码应该没什么。