8

I am getting an exception when trying to annotate images via Google Vision using the provided java client google vision.

specifically this code where the batch client.batchAnnotateImages occurs:

public void processOCR(byte[] file) 
{
     List<AnnotateImageRequest> requests = new ArrayList<>();

      ByteString imageByteString = ByteString.copyFrom(file);

      Image img = Image.newBuilder().setContent(imageByteString).build();
      Feature feat = Feature.newBuilder().setType(Type.DOCUMENT_TEXT_DETECTION).build();

      AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build();
      requests.add(request);

      try (ImageAnnotatorClient client = ImageAnnotatorClient.create()) 
      {

        BatchAnnotateImagesResponse response = client.batchAnnotateImages(requests);
        List<AnnotateImageResponse> responses = response.getResponsesList();
        client.close();

        //visionResultsDTO result = new visionResultsDTO();
        String ParagraphText = "";


        for (AnnotateImageResponse res : responses) {
          if (res.hasError()) {
            //throw exception.
            return;
          }

          // For full list of available annotations, see http://g.co/cloud/vision/docs
          TextAnnotation annotation = res.getFullTextAnnotation();
          for (Page page: annotation.getPagesList()) {
            String pageText = "";
            for (Block block : page.getBlocksList()) {
          String blockText = "";
              for (Paragraph para : block.getParagraphsList()) {
                String paraText = "";
                for (Word word: para.getWordsList()) {
                  String wordText = "";
              for (Symbol symbol: word.getSymbolsList()) {
                    wordText = wordText + symbol.getText();
                  }
              paraText = paraText + wordText;
                }
                // Output Example using Paragraph:
                blockText = blockText + paraText;
              }
              pageText = pageText + blockText;
            }
          }
          ParagraphText = annotation.getText();
        //  result.setResultText(ParagraphText);
        }
      } catch (Exception e) 
      {
        // TODO Auto-generated catch block
        e.printStackTrace();
       }
 }

I am being presented with the following Stack Trace / Error:

java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava/util/concurrent/Executor; at com.google.api.gax.retrying.BasicRetryingFuture.(BasicRetryingFuture.java:77) at com.google.api.gax.retrying.CallbackChainRetryingFuture.(CallbackChainRetryingFuture.java:62) at com.google.api.gax.retrying.ScheduledRetryingExecutor.createFuture(ScheduledRetryingExecutor.java:86) at com.google.api.gax.grpc.RetryingCallable.futureCall(RetryingCallable.java:57) at com.google.api.gax.grpc.RetryingCallable.futureCall(RetryingCallable.java:42) at com.google.api.gax.grpc.AuthCallable.futureCall(AuthCallable.java:57) at com.google.api.gax.grpc.UnaryCallable.futureCall(UnaryCallable.java:282) at com.google.api.gax.grpc.UnaryCallable.futureCall(UnaryCallable.java:293) at com.google.api.gax.grpc.UnaryCallable.call(UnaryCallable.java:321) at com.google.cloud.vision.v1.ImageAnnotatorClient.batchAnnotateImages(ImageAnnotatorClient.java:201) at com.google.cloud.vision.v1.ImageAnnotatorClient.batchAnnotateImages(ImageAnnotatorClient.java:177) at za.co.thumbtribe.core.googlevision.service.impl.GoogleVisionServiceImpl.processOCR(GoogleVisionServiceImpl.java:55)

Here are my POM Dependencies :

<dependencies>
<!-- Spring -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>4.2.5.RELEASE</version>
  <scope>compile</scope>
</dependency>
<dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>google-cloud-vision</artifactId>
    <version>0.20.3-beta</version>
    <exclusions>
    <exclusion>
      <groupId>com.google.auth</groupId>
      <artifactId>google-auth-library-oauth2-http</artifactId>
    </exclusion>
    <exclusion>
      <groupId>com.google.auth</groupId>
      <artifactId>google-auth-library-credentials</artifactId>
    </exclusion>
  <exclusion>
    <groupId>com.google.guava</groupId>
    <artifactId>*</artifactId>
</exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>com.google.auth</groupId>
  <artifactId>google-auth-library-oauth2-http</artifactId>
  <version>0.7.0</version>
 </dependency>
 <dependency>
  <groupId>com.google.auth</groupId>
  <artifactId>google-auth-library-credentials</artifactId>
  <version>0.7.0</version>
</dependency>

</dependencies>

I have tried excluding guava and including multiple versions of the API.

The code shown is the sample code from the google vision client implementation.

any ideas ?

Johann Combrink
  • 692
  • 8
  • 18

3 Answers3

5

The missing method directExecutor in MoreExecutors class is annotated @since 18.0 in the sources of guava (See source).

I guess you have in your classpath an older version of Guava that appears before the version 19.

You should run mvn dependency:analyze to track down the culprit. You may mvn dependency:analyze | grep guava to filter the output.

Then you can check which package imports the old dependency with :

mvn dependency:tree -Dverbose

Xvolks
  • 2,065
  • 1
  • 21
  • 32
1

Take a look on similar question

Basicaly, remove guava duplicate dependecy.

  1. Open pom.xml on eclipse.
  2. change to "dependence" tab.
  3. on filter, text "guava".
  4. if there is more than one lib version, right click on old and "exclude maven artifact".
  5. run maven clean.
  6. run maven build.

For best memory use, i suggest rewrite part of this code to use StringBuffer ou StringBuilder instead of String concat StringBuffer ou StringBuilder.

Auston
  • 307
  • 2
  • 6
1

You excluded guava from the google-cloud-vision dependency (because the version may be old i guess) but you are not adding the version you need as a dependency :

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>22.0</version>
</dependency>

google-auth-library-oauth2-http also is including a version of guava :com.google.guava:guava:jar:19.0:compile. I you are adding a version of guava as a dependency, you may want to exclude the one from

Akli REGUIG
  • 552
  • 4
  • 13