使用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;这里 ?
谢谢
答案 0 :(得分:0)
好的,我是个白痴!我的SOLR架构错误(唯一键未正确定义)。超类方式工作
那么,对于那些感兴趣的人: - 在模式中定义唯一键:
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<uniqueKey>id</uniqueKey>
注意在扩展超类的类中没有名为“id”的属性。如果你必须在你的类中添加一个'functionnal'id(对象的id,与solr id不同),那么不要忘记用
注释它。@Indexed(readonly = true,stored = false,searchable = false)