我正在尝试在运行于glassfish 4.1下的Maven Web应用程序上使用Elaticsearch 6.2.4及其Java Rest客户端API来实现自动完成功能。 我遇到以下错误:
java.lang.NoSuchFieldError:FAIL_ON_SYMBOL_HASH_OVERFLOW
我已经阅读了有关它的内容,并从本质上对项目依赖项(在pom.xml中)进行了相应的更改,因为我遇到的所有响应都绕过了Jackson库版本的冲突。
这是我尝试运行的代码:
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http")
));
SearchRequest searchRequest = new SearchRequest( "trustiser_suggest" );
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
String[] includeFields = new String[] {"member_mname","member_pic","member_fname","member_lname","topic_label"};
String[] excludeFields = null;
searchSourceBuilder.fetchSource(includeFields, excludeFields);
Map<String, List<? extends ToXContent>> contextMap = new HashMap<>();
contextMap.put("account_state", Collections.singletonList(CategoryQueryContext.builder().setCategory("active").build()));
SuggestionBuilder termSuggestionBuilder = SuggestBuilders.completionSuggestion("suggest_member" )
.prefix( str )
.contexts(contextMap);
SuggestBuilder suggestBuilder = new SuggestBuilder();
suggestBuilder.addSuggestion( "suggest-mem", termSuggestionBuilder );
SuggestionBuilder termSuggestionBuilder1 = SuggestBuilders.completionSuggestion("suggest_topic" )
.prefix( str )
.skipDuplicates(true);
suggestBuilder.addSuggestion( "suggest-top", termSuggestionBuilder1 );
searchSourceBuilder.suggest( suggestBuilder);
searchRequest.source( searchSourceBuilder );
SearchResponse searchResponse = null;
searchResponse = client.search( searchRequest );
System.out.println("AutoCompleteMemberTopicccccccccccccccc: "+searchResponse.toString());
我的当前pom.xml:
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch -->
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.2.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-client -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>6.2.4</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.2.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple -->
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
和错误:
java.lang.NoSuchFieldError: FAIL_ON_SYMBOL_HASH_OVERFLOW
at org.elasticsearch.common.xcontent.json.JsonXContent.<clinit>(JsonXContent.java:57)
at org.elasticsearch.common.xcontent.XContentFactory.contentBuilder(XContentFactory.java:121)
at org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder.contexts(CompletionSuggestionBuilder.java:203)
at com.trustiser.business.ElasticSearchDao1.AutoCompleteMemberTopic(ElasticSearchDao1.java:50)
at com.trustiser.service.SearchEngineService.searchMemberCategory(SearchEngineService.java:33)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:151)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:171)
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:152)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:104)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:387)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:331)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:103)
最后是Web项目的Maven树
--- maven-dependency-plugin:2.8:tree (default-cli) @ elasticmavenprojet ---
com.trustiser:elasticmavenprojet:war:1.0-SNAPSHOT
+- javax:javaee-web-api:jar:7.0:provided
+- com.fasterxml.jackson.core:jackson-core:jar:2.8.10:compile
+- org.elasticsearch:elasticsearch:jar:6.2.4:compile
| +- org.elasticsearch:elasticsearch-core:jar:6.2.4:compile
| +- org.apache.lucene:lucene-core:jar:7.2.1:compile
| +- org.apache.lucene:lucene-analyzers-common:jar:7.2.1:compile
| +- org.apache.lucene:lucene-backward-codecs:jar:7.2.1:compile
| +- org.apache.lucene:lucene-grouping:jar:7.2.1:compile
| +- org.apache.lucene:lucene-highlighter:jar:7.2.1:compile
| +- org.apache.lucene:lucene-join:jar:7.2.1:compile
| +- org.apache.lucene:lucene-memory:jar:7.2.1:compile
| +- org.apache.lucene:lucene-misc:jar:7.2.1:compile
| +- org.apache.lucene:lucene-queries:jar:7.2.1:compile
| +- org.apache.lucene:lucene-queryparser:jar:7.2.1:compile
| +- org.apache.lucene:lucene-sandbox:jar:7.2.1:compile
| +- org.apache.lucene:lucene-spatial:jar:7.2.1:compile
| +- org.apache.lucene:lucene-spatial-extras:jar:7.2.1:compile
| +- org.apache.lucene:lucene-spatial3d:jar:7.2.1:compile
| +- org.apache.lucene:lucene-suggest:jar:7.2.1:compile
| +- org.elasticsearch:securesm:jar:1.2:compile
| +- org.elasticsearch:elasticsearch-cli:jar:6.2.4:compile
| | \- net.sf.jopt-simple:jopt-simple:jar:5.0.2:compile
| +- com.carrotsearch:hppc:jar:0.7.1:compile
| +- joda-time:joda-time:jar:2.9.9:compile
| +- org.yaml:snakeyaml:jar:1.17:compile
| +- com.fasterxml.jackson.dataformat:jackson-dataformat-smile:jar:2.8.10:compile
| +- com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:jar:2.8.10:compile
| +- com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:jar:2.8.10:compile
| +- com.tdunning:t-digest:jar:3.0:compile
| +- org.hdrhistogram:HdrHistogram:jar:2.1.9:compile
| +- org.apache.logging.log4j:log4j-api:jar:2.9.1:compile
| \- org.elasticsearch:jna:jar:4.5.1:compile
+- org.elasticsearch.client:elasticsearch-rest-client:jar:6.2.4:compile
| +- org.apache.httpcomponents:httpclient:jar:4.5.2:compile
| +- org.apache.httpcomponents:httpcore:jar:4.4.5:compile
| +- org.apache.httpcomponents:httpasyncclient:jar:4.1.2:compile
| +- org.apache.httpcomponents:httpcore-nio:jar:4.4.5:compile
| +- commons-codec:commons-codec:jar:1.10:compile
| \- commons-logging:commons-logging:jar:1.1.3:compile
+- org.elasticsearch.client:elasticsearch-rest-high-level-client:jar:6.2.4:compile
| +- org.elasticsearch.plugin:parent-join-client:jar:6.2.4:compile
| | +- org.locationtech.spatial4j:spatial4j:jar:0.6:compile
| | +- com.vividsolutions:jts:jar:1.13:compile
| | \- org.apache.logging.log4j:log4j-core:jar:2.9.1:compile
| +- org.elasticsearch.plugin:aggs-matrix-stats-client:jar:6.2.4:compile
| \- org.elasticsearch.plugin:rank-eval-client:jar:6.2.4:compile
\- com.googlecode.json-simple:json-simple:jar:1.1.1:compile
\- junit:junit:jar:4.10:compile
\- org.hamcrest:hamcrest-core:jar:1.1:compile
谢谢:-)
答案 0 :(得分:1)
您是对的,这是Jackson库抛出的错误消息,elasticsearch将其用于JSON序列化和反序列化,并且是由Jackson版本的版本冲突引起的。
通过在pom.xml中定义以下依赖关系,我可以看到您明确包含了Jackson库。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.10</version>
</dependency>
通过查看您的mvn tree
,我发现Elasticsearch也带来了一些Jackson库。您可以尝试以下2个选项吗?
选项1.删除我刚才提到的明确的Jackson依赖项,并进行干净的构建。 (请注意,这种方法不太可能起作用:),但是尝试使用它没有危害。
选项2。我查看了我的项目,并且正在使用elasticsearch 7.1和下面的Jackson核心库。
com.fasterxml.jackson.core:jackson-core:jar:2.9.8:compile
如果您无法确定哪个版本与您的es版本是兼容的jackson核心版本,则可以升级到elasticsearch 7.1并使用我提供的Jackson版本,它应该可以工作。
答案 1 :(得分:0)
经过几天的工作和研究,终于找到了解决问题的方法。 该问题是由于ES高级客户端api的依赖项与glassfish模块上存在的依赖项之间的版本冲突引起的(Jackson-core是其中之一)。 因为替换jarfish的glassfish模块目录是一种冒险的做法,所以我应用的解决方案是对ES依赖项进行着色,并使用maven shade插件在其中重命名软件包。 以下是实现该解决方案的步骤:
<modelVersion>4.0.0</modelVersion>
<groupId>com.trustiser</groupId>
<artifactId>elasticshade</artifactId>
<version>6.2.4</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.2.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<relocations>
<relocation>
<pattern>org.elasticsearch</pattern>
<shadedPattern>hidden.org.elasticsearch</shadedPattern>
</relocation>
<relocation>
<pattern>org.apache.lucene</pattern>
<shadedPattern>hidden.org.apache.lucene</shadedPattern>
</relocation>
<relocation>
<pattern>com.fasterxml</pattern>
<shadedPattern>hidden.com.fasterxml</shadedPattern>
</relocation>
<relocation>
<pattern>org.apache.httpcomponents</pattern>
<shadedPattern>hidden.org.apache.httpcomponents</shadedPattern>
</relocation>
<relocation>
<pattern>org.hdrhistogram</pattern>
<shadedPattern>hidden.org.hdrhistogram</shadedPattern>
</relocation>
<relocation>
<pattern>org.slf4j</pattern>
<shadedPattern>hidden.org.slf4j</shadedPattern>
</relocation>
<relocation>
<pattern>org.yaml</pattern>
<shadedPattern>hidden.org.yaml</shadedPattern>
</relocation>
<relocation>
<pattern>net.sf.jopt-simple</pattern>
<shadedPattern>hidden.net.sf.jopt-simple</shadedPattern>
</relocation>
<relocation>
<pattern>joda-time</pattern>
<shadedPattern>hidden.joda-time</shadedPattern>
</relocation>
<relocation>
<pattern>commons-logging</pattern>
<shadedPattern>hidden.commons-logging</shadedPattern>
</relocation>
<relocation>
<pattern>commons-codec</pattern>
<shadedPattern>hidden.commons-codec</shadedPattern>
</relocation>
<relocation>
<pattern>com.tdunning</pattern>
<shadedPattern>hidden.com.tdunning</shadedPattern>
</relocation>
<relocation>
<pattern>com.github.spullara</pattern>
<shadedPattern>hidden.com.github.spullara</shadedPattern>
</relocation>
<relocation>
<pattern>com.carrotsearch</pattern>
<shadedPattern>hidden.com.carrotsearch</shadedPattern>
</relocation>
</relocations>
<shadedArtifactAttached>false</shadedArtifactAttached>
<artifactSet>
<includes>
<include>*:*</include>
</includes>
</artifactSet>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.PluginXmlResourceTransformer"/>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.trustiser.elasticshade.App</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
将在“弹性阴影项目位置” \ target上创建罐子
在maven本地存储库上添加阴影依赖项:
在我的Maven Java Web应用程序的pom.xml上添加elasticsearch的阴影依赖项,而不是直接使用elasticsearch高级REST API
appender.console.type = Console
appender.console.name = console
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %marker%m%n
rootLogger.level = info
rootLogger.appenderRef.console.ref = console