gpt4 book ai didi

java - AmazonS3Builder 生成有效的 AmazonS3 对象,但最终返回 null

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:50:50 26 4
gpt4 key购买 nike

我正在使用 AWS Java SDK v1 并尝试使用构建器创建 AmazonS3 实例。我正在遵循 AWS 文档中的指南 here并使用 BasicAWSCredentials 对象传递显式凭据。当构建器构建时,我将一个空客户端返回到 s3Client,这是我存储实例的地方,我不确定为什么。 try-catch block 不会抛出或捕获任何错误。这是我建立连接的方式:

    BasicAWSCredentials awsCreds = null;
try {
awsCreds = new BasicAWSCredentials(settings.getAccessKey(), settings.getSecretKey());
} catch (Exception e) {
e.printStackTrace();
throw new IOException(e.getMessage());
}

try {
AmazonS3 s3Client = AmazonS3Client.builder()
.withCredentials(new AWSStaticCredentialsProvider(awsCreds))
.withRegion(Regions.US_EAST_1)
.build();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(s3Client);

我已经使用 Eclipse 调试器逐步完成它,看起来 build() 调用实际上返回了一个有效的 AmazonS3Client 实例,但是在此引用返回到 s3Client 之前 变量,有一个调用 checkPackageAccess() 的步骤,这个返回值就是由于某种原因返回的值。进一步检查后,我发现 checkPackageAccess() 是 java.lang.ClassLoader 中的一个方法,由 JVM 调用,它的返回类型为 void。在我的应用程序中,似乎没有设置默认的 SecurityManager,因此在 ClassLoader 的 checkPackageAccess() 方法中没有调用其他函数。

我对这种行为有点困惑。我的 JRE 是 1.8。据我了解,在查找类定义时总是调用ClassLoader,但为什么在类已经实例化后调用它,为什么 build() 的原始返回值是> 函数没有返回到调用者上下文?在这种情况下,调试器显示存在一个有效的 AmazonS3Client 对象,并且在调用 checkPackageAccess 之前通过调用 build() 返回该对象。

我之前在同一个项目中用几乎相同的代码创建了一个 AmazonRedshift 实例,并且运行顺利,所以我非常肯定问题出在 AmazonS3 类或构建器上,但我不确定在哪里,我没有看到任何错误或奇怪的打印。

用于与 Amazon Redshift 建立类似连接的代码:

        BasicAWSCredentials awsCreds = null;
try {
awsCreds = new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY);
} catch (Exception e) {
e.printStackTrace();
throw new IOException(e.getMessage());
}
try {
client = AmazonRedshiftClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(awsCreds))
.withRegion(Regions.US_EAST_1)
.build();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(client);

有没有人调试过这种问题?我该怎么做才能解决这个问题并取回有效实例?

最佳答案

问题最终变得更加根本。我觉得写这个几乎是尴尬的。我不得不重新审视我的代码才能找到它,但我在 try block 中重新声明了 s3Client。

private AmazonS3 s3Client = null;

...

BasicAWSCredentials awsCreds = null;
try {
awsCreds = new BasicAWSCredentials(settings.getAccessKey(), settings.getSecretKey());
} catch (Exception e) {
e.printStackTrace();
throw new IOException(e.getMessage());
}

try {
AmazonS3 s3Client = AmazonS3Client.builder()
.withCredentials(new AWSStaticCredentialsProvider(awsCreds))
.withRegion(Regions.US_EAST_1)
.build();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(s3Client);

当它到达实际使用 AmazonS3 对象的代码时,保存对它的引用的局部变量已经超出范围。不敢相信我没听清楚。

关于java - AmazonS3Builder 生成有效的 AmazonS3 对象,但最终返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43124257/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com