java - SolrCrud存储库: use inheritance

标签 java spring-boot spring-data-solr

使用java8、spring-boot 1.3.5、SOLR 5.5.1

我试图使用 SolrCrudRepository 将几个不同的对象保存到同一模式中。 起初,我只有对象 A,所以我使用了

public interface SolrRepository extends SolrCrudRepository<A , String> 
..... //in the service class : 
@Autowired
private SolrRepository solrRepository;
....
solrRepository.save(result);

就是这样。在项目进展过程中,我被要求索引另一个对象 B(与业务视角中的 A 相关,但仅此而已)。因此,由于我不想创建花药 solr 存储库,所以我让 A 和 B 扩展了另一个抽象类 AbstractSolrPOJO,并改为使用:

public interface SolrRepository extends SolrCrudRepository<AbstractSolrPojo , String>

那是行不通的。 solr 存储库的 Autowiring 失败:

Caused by: java.lang.NullPointerException: null
at org.springframework.data.solr.repository.support.MappingSolrEntityInformation.getIdAttribute(MappingSolrEntityInformation.java:51)
at org.springframework.data.solr.repository.support.SimpleSolrRepository.<init>(SimpleSolrRepository.java:81)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147)

Spring 似乎正在寻找 id 属性,该属性是使用 @Field("id") 注释在两个类中定义的。

将该 id 移动到父类(super class)不起作用,我尝试使用接口(interface),提供重写方法

@Field("id")
String getIndexId();

但这也失败了,但出现另一个错误:

Caused by: org.apache.solr.client.solrj.impl.HttpSolrServer$RemoteSolrException: Document is missing mandatory uniqueKey field

那么,我真的必须为每个对象创建一个存储库,还是这里有一个“技巧”?

谢谢

最佳答案

好吧,我是个白痴!我的 SOLR 架构错误(唯一键未正确定义)。父类(super class)方式有效

所以,对于那些感兴趣的人: - 在架构中定义唯一键:

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<uniqueKey>id</uniqueKey>
  • 将关键定义放在父类(super class)中(@Field("id") 注释应该在那里)
  • 请注意,扩展父类(super class)的类中不要有名为“id”的属性。如果您必须向您的类添加“功能”id(对象的 id,与 solr id 不同),那么不要忘记用

    对其进行注释

    @Indexed(只读 = true、存储 = false、可搜索 = false)

关于java - SolrCrud存储库: use inheritance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37617847/

相关文章:

solr - 使用 API 更改 SolrCloud 中的默认查询字段

java - 字符数组列表,仅替换字符

java - Gradle无法找到Spring核心jar

mysql - 由于引擎myisam的原因,Spring boot创建表mysql Db失败

java - 从 solrj 迁移到 spring-data-solr

java - 使用 Spring Data Solr 验证 SolrCore

java - Android 尝试旋转图像时出现 OutOfMemoryError

java - JTable 未显示。我如何解决它?

java - 使用@KafkaListener 处理错误

java - 如何在事务开始之前或提交之前执行操作?