SolrCrudRepository:使用继承

时间:2016-06-03 15:08:36

标签: 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(与商业pov中的A相关,但仅限于此)。所以,由于我不想创建anther solr repo,我让A和B扩展了另一个抽象类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属性,它是使用@Field(&#34; id&#34;)注释在两个类中定义的。

将该id移动到超类是不行的,我尝试了一个接口,提供了一个覆盖的方法

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

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

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

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

谢谢

1 个答案:

答案 0 :(得分:0)

好的,我是个白痴!我的SOLR架构错误(唯一键未正确定义)。超类方式工作

那么,对于那些感兴趣的人: - 在模式中定义唯一键:

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

    注释它。

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