当前位置: 首页 > 知识库问答 >
问题:

无法在运行时设置SolrDocument注释

空夕
2023-03-14

我使用的是Spring数据Solr,我有以下Solr文档模型类,并有一个对应的SolrCrudRepository用于该类

@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”)”。

我有一个服务,它使用以下方法来查找使用存储库和模型类的所有文档

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

共有1个答案

廉元龙
2023-03-14

为什么不编写一个自定义SolrRepository来解决这个问题?您可以在自定义存储库中注入SolrTemboard,允许您像这样为查询指定集合:

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混合使用。

请参阅Spring中的示例。

 类似资料:
  • 我已经下载了活动5.10 zip文件,然后我下载并配置了Apache ANT,我测试了一下,它成功了。但是我无法运行此链接中指定的演示文件http://activiti.org/userguide/#demo.setup 如果我使用cmd命令行键入以下命令:- 我将得到以下错误:- 有人能帮我找出问题所在吗?溴 ::: UPDATE::: 感谢您的回复,我已经将ANT bin文件复制到活动的安装目

  • 问题内容: 使用IKVM时,如何在运行时设置CLASSPATH变量? 我一直在尝试使用以下方法: 我正在调用的类需要在类路径中使用配置文件才能工作-而且我不断收到错误消息,似乎表明它没有获得设置。 我尝试添加变量的方式不正确吗? 问题答案: 我试图做同样的事情。我将一些jar文件编译为.Net dll,但是其中一些(第3方)jar文件正试图从java类路径中加载其配置文件。 我通过为ikvmc工具

  • 我通过终端安装了Java。我Linux5.8.0-53通用Kubuntu Java版本输出 我的VSCode设置指向 但是,我得到一个错误,即“Visual Studio代码设置(/usr/lib/jvm/java-16-openjdk-amd64)中定义的java.home变量不指向JDK。

  • 上游集群支持以下运行时配置: 主动健康检查 health_check.min_interval 健康检查间隔的最小值。默认值为0。运行状况检查间隔将介于min_interval和max_interval之间。 health_check.max_interval 健康检查间隔的最大值。默认值是MAX_INT。健康检查间隔将在min_interval和max_interval之间。 health_ch

  • HTTP连接管理器支持以下运行时设置: tracing.client_enabled 如果设置了x-client-trace-id头部,请求将被强制跟踪的百分比。默认为100。 tracing.global_enabled 在所有其他检查(强制跟踪,采样等)生效之后,将被跟踪的请求百分比。默认为100。 tracing.random_sampling 被随机跟踪的请求万分比。浏览此处获取更多信息。

  • 问题内容: 在已经加载(运行)JVM之后,是否可以更改/修改/添加VM参数?如果是这样,我该怎么办? 问题答案: 对于通过命令行上的标志设置的属性,您需要System.setProperty。例如: 更新: 您无法动态启用调试,但是可以在启动时启用调试,但稍后再附加调试器。通过以下操作,您可以侦听端口12345并立即开始运行程序(通过)。然后,您可以在需要时附加调试器,分离调试器,稍后再附加等。