今天在使用lucene的时候,想直接在Controller中返回json对象,于是在Spring中配置了JackSon的converter:

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">

<property name="messageConverters">

<list>

<ref bean="jacksonMessageConverter"/>

</list>

</property>

</bean>

配置好后,就可以直接在Controller中返回容器对象,如map、list等,jackson会自动的将对象转为JSON对象返回,方便前端使用。在几个索引库中使用都没有问题,正常工作,但是当我使用到歌曲索引库的时候出问题了,一直报错,如下:

Caused by: java.lang.IllegalArgumentException: Conflicting getter definitions for property "match": org.apache.lucene.search.ComplexExplanation#getMatch(0 params) vs org.apache.lucene.search.ComplexExplanation#isMatch(0 params)

    at org.codehaus.jackson.map.introspect.POJOPropertyBuilder.getGetter(POJOPropertyBuilder.java:167)

    at org.codehaus.jackson.map.introspect.POJOPropertyBuilder.getAccessor(POJOPropertyBuilder.java:116)

    at org.codehaus.jackson.map.ser.BeanSerializerFactory.removeIgnorableTypes(BeanSerializerFactory.java:705)

    at org.codehaus.jackson.map.ser.BeanSerializerFactory.findBeanProperties(BeanSerializerFactory.java:562)

    at org.codehaus.jackson.map.ser.BeanSerializerFactory.constructBeanSerializer(BeanSerializerFactory.java:434)

    at org.codehaus.jackson.map.ser.BeanSerializerFactory.findBeanSerializer(BeanSerializerFactory.java:347)

    at org.codehaus.jackson.map.ser.BeanSerializerFactory.createSerializer(BeanSerializerFactory.java:291)

    at org.codehaus.jackson.map.ser.StdSerializerProvider._createUntypedSerializer(StdSerializerProvider.java:782)

    at org.codehaus.jackson.map.ser.StdSerializerProvider._createAndCacheUntypedSerializer(StdSerializerProvider.java:735)

    ... 64 more

Google了一下这个错误,发现是jackson在将map转化为JSON对象时,需要调用相应的get方法,而在org.apache.lucene.search.ComplexExplanation类中,有如下两个方法。

Boolean

getMatch() 
          The match status of this explanation node.

boolean

isMatch() 
          Indicates whether or not this Explanation models a good match.

这两个方法返回值都为boolean类型,并且名字都是match,所以导致jackson类不知道该使用哪一个获取match的值,所以报了confict错误。

那么再去查jackson的文档,如下:

We have defined both isVoided() and getVoided() methods in BaseOpenmrsData (and isRetired() and getRetired() in BaseOpenmrsMetadata), which is technically not right according to bean specifications. The Jackson JSON library bombs on this, like:

Caused by: java.lang.IllegalArgumentException: Conflicting getter definitions

for property "voided": org.openmrs.BaseOpenmrsData#isVoided(0 params) vs

org.openmrs.BaseOpenmrsData#getVoided(0 params)

Selected approach (per the Design Forum on 15-Aug-2012):

Go through the API and find all methods with the signature "Boolean isXyz()", and for each of them:

Verify we have a correct "Boolean getXyz()" method

Deprecate the incorrect isXyz() method, saying to use the getXyz() method instead

Add the @JsonIgnore annotation to the incorrect isXyz method

It may be possible to salvage Saptarshi's attached patch here, but given the amount of time that has passed since he wrote it, it may be easier to just re-do the work against trunk.

从上述文档中可以看出,如果返回值相同,并且ismatch和getmatch同时存在时就会引发conflict异常,要么删除其中一个方法,或者在不需要使用的方法上加上@的annotation。但是为了这个小问题去修改lucene的源码,代价有点高,后期也不太好维护。

那么就继续想办法,突然发现,我并不需要返回match这个值啊,我也没有主动调用获取这个值,那么究竟是哪块使用到了match这个值呢?

继续看代码,将问题定位到如下一段代码:

Explanation explanation = indexSearcher.explain(query, docID);

这个是用来调试查询结果的,里面包含了lucene打分的结果。

所以可以把这个去掉,那么在我的map中就不会调用getmatch或者ismatch方法了,也就解决了冲突,去掉后再运行,没有报错,完美运行~~

Lucene和jackson冲突的更多相关文章

  1. WebLogic 12c SpringMVC Jackson 冲突 java.lang.NoSuchMethodError: TypeFactory.constructParametrizedType(Ljava/lang/Class;Ljava/lang/Class;[Ljava/lang/Class;)

    <?xml version="1.0" encoding="UTF-8"?> <wls:weblogic-web-app xmlns:wls= ...

  2. Lucene 4.X 倒排索引原理与实现: (1) 词典的设计

    词典的格式设计 词典中所保存的信息主要是三部分: Term字符串 Term的统计信息,比如文档频率(Document Frequency) 倒排表的位置信息 其中Term字符串如何保存是一个很大的问题 ...

  3. Lucene -- 实时索引

    lucene的实时搜索可以分成:实时和近实时的搜索. 实时只能依靠内存了. 近实时可以用lucene中提供org.apache.lucene.index.DirectoryReader.open(In ...

  4. Maven类包冲突终极解决方案

    本文转自:http://ian.wang/106.htm 举例A依赖于B及C,而B又依赖于X.Y,而C依赖于X.M,则A除引B及C的依赖包下,还会引入X,Y,M的依赖包(一般情况下了,Maven可通过 ...

  5. IKAnalyzer 和 solr4.3 冲突

    solr4.3 运行之后发现异常:Exception in thread "main" java.lang.VerifyError: class org.wltea.analyze ...

  6. Lucene学习总结之四:Lucene索引过程分析

    对于Lucene的索引过程,除了将词(Term)写入倒排表并最终写入Lucene的索引文件外,还包括分词(Analyzer)和合并段(merge segments)的过程,本次不包括这两部分,将在以后 ...

  7. 记一次jar包冲突

    题记:永远不要在同一个项目中,引用不同版本的两个jar包,否则,这可能就是一个大坑. 在做网校项目的时候,帮助中心要使用lucene,所以就引入了lucene-5.5.1的包,删掉了原先存在于项目中的 ...

  8. Lucene.Net3.0.3+盘古分词器学习使用

    一.Lucene.Net介绍 Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索 ...

  9. 一种常见的maven打包后同名文件冲突错误

    在使用一些开源框架的时候(比如spark.hadoop.lucene等),偶尔会见到说找不到某个具体实现类或者某个配置(比如spark的akka配置)不见了. 部分例子如下: [Lucene]An S ...

随机推荐

  1. linux command cp.

    Examples cp file1.txt newdir Copies the file1.txt in the current directory to the newdir subdirector ...

  2. Mavne + Spring整合CXF

    http://blog.csdn.net/xiongyu777888/article/details/23787615(没毛病) http://blog.csdn.net/hbsong75/artic ...

  3. PT与PX,em(%)区别

    字体大小的设置单位,常用的有2种:px.pt.这两个有什么区别呢?先搞清基本概念:px就是表示pixel,像素,是屏幕上显示数据的最基本的点:pt就是point,是印刷行业常用单位,等于1/72英寸. ...

  4. iOSUI基础——懒加载

    1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再去进行实例化 ...

  5. Swift - 28 - 内部参数名和外部参数名

    //: Playground - noun: a place where people can play import UIKit // 外部参数的作用是为了让程序员调用代码的时候能清晰的看出所传参数 ...

  6. JavaScript 字符串

    字符串属性 属性 描述 constructor 返回创建字符串属性属性的函数 length 返回字符串的长度 prototype 允许您向对象添加属性和方法 字符串方法 Method 描述 charA ...

  7. Js 旋转平滑特效

    效果图 源码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  8. Android学习----Android Studio 技巧汇总

    关于快捷键 The File Structure Popup ctrl+f12此快捷键可以调出当前文件的大纲,并通过模糊匹配快速跳转至指定的方法.勾选上“show anonymous classes” ...

  9. 如何完全禁用或卸载Windows 10中的OneDrive - 51CTO.COM

    OneDrive 是微软的个人云存储平台,提供了对个人用户的文件托管.存储和同步等服务,OneDrive 默认被内置在 Windows 10 操作系统当中,而且当用户使用 微软账户 登录时,OneDr ...

  10. js ie浏览器下的选中操作

    最近在学习jquery  好多英文网站,制作一个网站的副本,可以主动地学习.好像给自己的网站添加一个小词典,就像沪江小d那样. js试了好几种方法 实在不行,网上搜索了下 ,用到了浏览器开发.本篇文章 ...