Google Cloud Vision客户端API-Java-异常:计算凭据元数据失败
我想在我基于谷歌云的应用程序中提供“搜索已经存储在谷歌云存储中的PDF或TIFF文件中的任何文本”功能。因此,我将此链接中给出的示例(第1217行到第1280行)复制到我的项目中 尝试1的详细信息 appengine-web.xml的内容:Google Cloud Vision客户端API-Java-异常:计算凭据元数据失败,java,google-cloud-vision,Java,Google Cloud Vision,我想在我基于谷歌云的应用程序中提供“搜索已经存储在谷歌云存储中的PDF或TIFF文件中的任何文本”功能。因此,我将此链接中给出的示例(第1217行到第1280行)复制到我的项目中 尝试1的详细信息 appengine-web.xml的内容: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE xml> <appengine-web-app xmlns="http://appengine.google.co
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xml>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application>garbledappname</application>
<version>1</version>
<runtime>java8</runtime>
<threadsafe>true</threadsafe>
<system-properties>
<property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
</system-properties>
<sessions-enabled>true</sessions-enabled>
<url-stream-handler>urlfetch</url-stream-handler>
</appengine-web-app>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xml>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application>garbledappname</application>
<version>1</version>
<runtime>java8</runtime>
<threadsafe>true</threadsafe>
<system-properties>
<property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
</system-properties>
<sessions-enabled>true</sessions-enabled>
<url-stream-handler>urlfetch</url-stream-handler>
<env-variables>
<env-var name="GOOGLE_APPLICATION_CREDENTIALS"
value="WEB-INF/myproject-eaa46206856e.json" />
</env-variables>
</appengine-web-app>
因此,我更改了尝试2的appengine-web.xml
尝试2的详细信息
appengine-web.xml的内容:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xml>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application>garbledappname</application>
<version>1</version>
<runtime>java8</runtime>
<threadsafe>true</threadsafe>
<system-properties>
<property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
</system-properties>
<sessions-enabled>true</sessions-enabled>
<url-stream-handler>urlfetch</url-stream-handler>
</appengine-web-app>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xml>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application>garbledappname</application>
<version>1</version>
<runtime>java8</runtime>
<threadsafe>true</threadsafe>
<system-properties>
<property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
</system-properties>
<sessions-enabled>true</sessions-enabled>
<url-stream-handler>urlfetch</url-stream-handler>
<env-variables>
<env-var name="GOOGLE_APPLICATION_CREDENTIALS"
value="WEB-INF/myproject-eaa46206856e.json" />
</env-variables>
</appengine-web-app>
在如上所述更改appengine-web.xml、构建、部署和执行应用程序后,我遇到了以下异常:
javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: java.io.IOException: The Application Default Credentials are not available. They are available if running in Google Compute Engine. Otherwise, the environment variable GOOGLE_APPLICATION_CREDENTIALS must be defined pointing to a file defining the credentials. See https://developers.google.com/accounts/docs/application-default-credentials for more information
org.eclipse.jetty.servlet.ServletHandler doHandle: (ServletHandler.java:624)
javax.servlet.ServletException: com.google.api.gax.rpc.UnauthenticatedException: io.grpc.StatusRuntimeException: UNAUTHENTICATED: Failed computing credential metadata
在我的代码中,这是上面跟踪中报告的行:
BatchAnnotateFilesResponse response = imageAnnotatorClient.batchAnnotateFiles(request);
这是整个方法:
setQualifiedFiles = mapOfQualifiedReportFiles.keySet();
itrOverSetOfQualifiedFiles = setQualifiedFiles.iterator();
while(itrOverSetOfQualifiedFiles.hasNext()) {
try (ImageAnnotatorClient imageAnnotatorClient = ImageAnnotatorClient.create()) {
qualifiedFileName = itrOverSetOfQualifiedFiles.next();
fileNameOnCloud = mapOfQualifiedReportFiles.get(qualifiedFileName);
gcsFileName = new GcsFilename(bucketNameExtVendorReports, fileNameOnCloud);
gcsPath = "gs://" + bucketNameExtVendorReports + "/" + fileNameOnCloud;
logger.info("gcsPath = " + gcsPath);
GcsSource gcsSource = GcsSource.newBuilder().setUri(gcsPath).build();
InputConfig inputConfig = InputConfig.newBuilder().setGcsSource(gcsSource).build();
Feature.Type type = Feature.Type.DOCUMENT_TEXT_DETECTION;
Feature featuresElement = Feature.newBuilder().setType(type).build();
List<Feature> features = Arrays.asList(featuresElement);
int pagesElement = 1;
int pagesElement2 = 2;
List<Integer> pages = Arrays.asList(pagesElement, pagesElement2);
AnnotateFileRequest requestsElement = AnnotateFileRequest.newBuilder()
.setInputConfig(inputConfig)
.addAllFeatures(features)
.addAllPages(pages)
.build();
List<AnnotateFileRequest> requests = Arrays.asList(requestsElement);
BatchAnnotateFilesRequest request = BatchAnnotateFilesRequest.newBuilder().addAllRequests(requests).build();
BatchAnnotateFilesResponse response = imageAnnotatorClient.batchAnnotateFiles(request);
for (AnnotateImageResponse imageResponse :
response.getResponsesList().get(0).getResponsesList()) {
System.out.printf("Full text: %s\n", imageResponse.getFullTextAnnotation().getText());
for (Page page : imageResponse.getFullTextAnnotation().getPagesList()) {
for (Block block : page.getBlocksList()) {
System.out.printf("\nBlock confidence: %s\n", block.getConfidence());
for (Paragraph par : block.getParagraphsList()) {
System.out.printf("\tParagraph confidence: %s\n", par.getConfidence());
for (Word word : par.getWordsList()) {
System.out.printf("\t\tWord confidence: %s\n", word.getConfidence());
for (Symbol symbol : word.getSymbolsList()) {
System.out.printf("\t\t\tSymbol: %s, (confidence: %s)\n",
symbol.getText(), symbol.getConfidence());
}
}
}
}
}
}
}
}
因此,我用try-catch-cluase将该行包围起来,结果堆栈跟踪显示:
com.google.api.gax.rpc.UnauthenticatedException: io.grpc.StatusRuntimeException: UNAUTHENTICATED: Failed computing credential metadata
Caused by: com.google.apphosting.api.ApiProxy$CallNotFoundException: Can't make API call urlfetch.Fetch in a thread that is neither the original request thread nor a thread created by ThreadManager
对如何解决这个问题有什么建议吗?在谷歌搜索中,出现了一些其他人曾经遇到过这个问题的帖子(由:com.goo……)但似乎没有解决办法。感谢您的帮助。这似乎只是一个身份验证问题,看起来与Vision API无关。身份验证错误发生在Vision API调用期间,因为在进行API调用之前,凭据被延迟加载/刷新
您似乎正在将应用程序部署到App Engine。如果是这样,本地设置的任何环境变量(如
GOOGLE\u APPLICATION\u CREDENTIALS
)都不会产生任何效果。您可能需要查看for App Engine上的文档。授予访问权限最直接的方法是授予对的权限。这似乎只是一个身份验证问题,看起来与Vision API无关。身份验证错误发生在Vision API调用期间,因为在进行API调用之前,凭据被延迟加载/刷新
您似乎正在将应用程序部署到App Engine。如果是这样,本地设置的任何环境变量(如
GOOGLE\u APPLICATION\u CREDENTIALS
)都不会产生任何效果。您可能需要查看for App Engine上的文档。授予访问权限最直接的方法是授予对的权限。这可能与此相关-您可以尝试将您的google auth库依赖项更新到0.17.1版吗?@Jon Skeet:谢谢。但我的pom.xml.Rats中已经有了这种依赖关系的确切版本。那样的话,恐怕我没有任何想法:(有人能帮忙吗?如果我的帖子中缺少信息,请告诉我,我会立即提供。你可以帮助更快地回答这个问题的一种方法是加入一个。我建议使用服务帐户创建一个控制台应用程序。我怀疑你可以显示完整的控制台应用程序w。)我需要30行代码(可能更少)-这将使人们更容易自己复制它。我已经在内部请了一位在Java库工作的同事,看看他们是否可以进一步帮助您。这可能与此相关-您可以尝试将您的google auth库依赖项更新到0.17.1版吗?@Jon Skeet:谢谢。但这正是依赖关系已经存在于我的pom.xml.Rats中。在这种情况下,我恐怕没有任何想法:(有人能帮忙吗?如果我的帖子中缺少信息,请告诉我,我会立即提供。你可以帮助更快地回答这个问题的一种方法是加入一个。我建议使用服务帐户创建一个控制台应用程序。我怀疑你可以显示完整的控制台应用程序w。)我用了30行代码(可能更少)-这将使人们更容易自己复制它。我在内部请了一位在Java库工作的同事,看看他们是否能进一步帮助您。Jeff非常感谢您的回复。我(再次)关注了这些链接。执行了此处列出的所有步骤,但均无效。我已使用新信息编辑了原始问题。请查看并提出解决方案。Jeff非常感谢您的回答。我(再次)查看了这些链接。执行了此处列出的所有步骤,但均无效。我已使用新信息编辑了原始问题。请查看并提出解决方案。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xml>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application>myApp</application>
<version>1</version>
<runtime>java8</runtime>
<threadsafe>true</threadsafe>
<system-properties>
<property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
</system-properties>
<sessions-enabled>true</sessions-enabled>
<url-stream-handler>urlfetch</url-stream-handler>
<env-variables>
<env-var name="GOOGLE_APPLICATION_CREDENTIALS"
value="WEB-INF/myapp-eba46306896e.json" />
</env-variables>
</appengine-web-app>
response = imageAnnotatorClient.batchAnnotateFiles(request);
com.google.api.gax.rpc.UnauthenticatedException: io.grpc.StatusRuntimeException: UNAUTHENTICATED: Failed computing credential metadata
Caused by: com.google.apphosting.api.ApiProxy$CallNotFoundException: Can't make API call urlfetch.Fetch in a thread that is neither the original request thread nor a thread created by ThreadManager