SolrCrudRepository : 使用继承

SolrCrudRepository : use inheritance

使用 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(与业务 pov 中的 A 相关,但仅此而已)。因此,由于我不想创建花药 solr 存储库,我让 A 和 B 扩展了另一个抽象 class AbstractSolrPOJO,并改为使用:

public interface SolrRepository extends SolrCrudRepository<AbstractSolrPojo , String>

那是行不通的。 solr repo 的自动装配失败:

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 属性,它在两个 classes 中使用 @Field("id") 注释定义。

将那个 id 移动到 superclass 没有用,我尝试了一个接口,提供了一个覆盖的方法

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

但这也失败了,但还有另一个错误:

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

所以,我真的必须为每个对象创建一个存储库,还是这里有 "trick"?

谢谢

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

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

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<uniqueKey>id</uniqueKey>
  • 将键定义放在 superclass 中(@Field("id") 注释应该在那里)
  • 注意不要在 class 扩展你的 superclass 中有一个名为 "id" 的属性。如果你必须添加一个 'functionnal' id 到你的 class (对象的 id,不同于 solr id)然后不要忘记用

    注释它

    @Indexed(readonly = true, stored = false, searchable = false)