无法在运行时设置 SolrDocument 注释
Unable to set SolrDocument annotation at RUNTIME
我正在使用 Spring Data Solr,我有以下 Solr 文档模型 class 并且有一个相应的 SolrCrudRepository class
@SolrDocument(collection = "oldCollectionName")
public class TestDocument {
@Id
@Indexed(name = "id", type = "string")
private String id;
@Field(value = "name")
private String name;
@Field(value = "externalid")
private Integer externalId;
}
我正在尝试在运行时修改注释“@SolrDocument(collection = "oldCollectionName")”。
我有一个服务,它具有以下方法来使用存储库和模型查找所有文档 class
public List<TestDocument> getDocumentsByName(String name){
String newSolrDocument = getModifiedSolrCollectionName();
alterAnnotationValue(TestDocument.class, SolrDocument.class, newSolrDocument);
SolrDocument solrDocument = TestDocument.class.getAnnotation(SolrDocument.class);
LOGGER.info("Dynamically set SolrDocument Annotaation: "+solrDocument.collection());
return testDocumentRepository.findByName(name);
}
更改注释的代码如下所示
public void alterAnnotationValue(Class<?> targetClass, Class<? extends Annotation> targetAnnotation, Annotation targetValue) {
try {
Method method = Class.class.getDeclaredMethod(ANNOTATION_METHOD, null);
method.setAccessible(true);
Object annotationData = method.invoke(targetClass);
Field annotations = annotationData.getClass().getDeclaredField(ANNOTATIONS);
annotations.setAccessible(true);
Map<Class<? extends Annotation>, Annotation> map = (Map<Class<? extends Annotation>, Annotation>) annotations.get(annotationData);
map.put(targetAnnotation, targetValue);
} catch (Exception e) {
e.printStackTrace();
}
}
使用这个我正确地将 newDocumentName 设置到注释映射中,但是在调用 testDocumentRepository 的 find 方法来查找文档时。正在选择旧的集合名称。
我需要做更多的事情才能让它起作用吗?或者我遗漏了什么?
作为参考,我遵循了以下教程http://www.baeldung.com/java-reflection-change-annotation-params
你为什么不写一个自定义 SolrRepository
来解决这个问题?
您可以在自定义存储库中注入 SolrTemplate
,允许您为查询指定一个集合,如下所示:
public class TestDocumentRepositoryImpl implements TestDocumentRepository {
private SolrOperations solrTemplate;
...
public CustomSolrRepositoryImpl(SolrOperations solrTemplate) {
super();
this.solrTemplate = solrTemplate;
}
@Override
public TestDocument findOneSpecifyingCollection(String collection, String id) {
return solrTemplate.getById(collection, id, TestDocument.class);
}
}
您可以对您喜欢的存储库操作执行类似的操作。
如果标准 Spring JPA 存储库不适合他们的需要,人们通常需要自己的实现。但是,如果需要,您仍然可以使用标准 SolrCrudRepository
mix your own。
See this 来自 Spring 的示例。
我正在使用 Spring Data Solr,我有以下 Solr 文档模型 class 并且有一个相应的 SolrCrudRepository class
@SolrDocument(collection = "oldCollectionName")
public class TestDocument {
@Id
@Indexed(name = "id", type = "string")
private String id;
@Field(value = "name")
private String name;
@Field(value = "externalid")
private Integer externalId;
}
我正在尝试在运行时修改注释“@SolrDocument(collection = "oldCollectionName")”。
我有一个服务,它具有以下方法来使用存储库和模型查找所有文档 class
public List<TestDocument> getDocumentsByName(String name){
String newSolrDocument = getModifiedSolrCollectionName();
alterAnnotationValue(TestDocument.class, SolrDocument.class, newSolrDocument);
SolrDocument solrDocument = TestDocument.class.getAnnotation(SolrDocument.class);
LOGGER.info("Dynamically set SolrDocument Annotaation: "+solrDocument.collection());
return testDocumentRepository.findByName(name);
}
更改注释的代码如下所示
public void alterAnnotationValue(Class<?> targetClass, Class<? extends Annotation> targetAnnotation, Annotation targetValue) {
try {
Method method = Class.class.getDeclaredMethod(ANNOTATION_METHOD, null);
method.setAccessible(true);
Object annotationData = method.invoke(targetClass);
Field annotations = annotationData.getClass().getDeclaredField(ANNOTATIONS);
annotations.setAccessible(true);
Map<Class<? extends Annotation>, Annotation> map = (Map<Class<? extends Annotation>, Annotation>) annotations.get(annotationData);
map.put(targetAnnotation, targetValue);
} catch (Exception e) {
e.printStackTrace();
}
}
使用这个我正确地将 newDocumentName 设置到注释映射中,但是在调用 testDocumentRepository 的 find 方法来查找文档时。正在选择旧的集合名称。
我需要做更多的事情才能让它起作用吗?或者我遗漏了什么?
作为参考,我遵循了以下教程http://www.baeldung.com/java-reflection-change-annotation-params
你为什么不写一个自定义 SolrRepository
来解决这个问题?
您可以在自定义存储库中注入 SolrTemplate
,允许您为查询指定一个集合,如下所示:
public class TestDocumentRepositoryImpl implements TestDocumentRepository {
private SolrOperations solrTemplate;
...
public CustomSolrRepositoryImpl(SolrOperations solrTemplate) {
super();
this.solrTemplate = solrTemplate;
}
@Override
public TestDocument findOneSpecifyingCollection(String collection, String id) {
return solrTemplate.getById(collection, id, TestDocument.class);
}
}
您可以对您喜欢的存储库操作执行类似的操作。
如果标准 Spring JPA 存储库不适合他们的需要,人们通常需要自己的实现。但是,如果需要,您仍然可以使用标准 SolrCrudRepository
mix your own。
See this 来自 Spring 的示例。