I'm trying to implement an autocomplete feature using elaticsearch 6.2.4 and its java rest client API on my maven web application which is running under glassfish 4.1 I am facing the below error:
java.lang.NoSuchFieldError: FAIL_ON_SYMBOL_HASH_OVERFLOW
I have read some about it and made changes accordingly essentially on project dependencies( inside pom.xml) because all responses that I met, turned around conflict on Jackson library version.
here is the code that I tried to run:
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());
my curent 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>
and the error:
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)
and finally the maven tree of the web project
--- 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
Thank you :-)
after several days of work and research, I finally find the solution of my problem. The problem is caused by a version conflict between dependencies of ES hight level client api and those existing on glassfish modules ( Jackson-core is one of them). Because replacing jars of glassfish module directory is a risky practice, the solution that I applied is to shade the ES dependency and rename there packages using maven shade plugin. These are followed steps to implement the solution:
<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>
The jar will be created on "elastic shade project location" \target
Add the shaded dependency on maven local repository:
Add the shaded dependency of elasticsearch on the pom.xml of my maven java web application instead of using elasticsearch hight level rest api directly
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