• 沒有找到結果。

须知

开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论 坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。

SignatureDoesNotMatch 签名不匹配

HTTP Code: 403

Error Code: SignatureDoesNotMatch

此类错误一般有三种原因:

1. 初始化ObsClient时传入的SK有误,解决方法:检查SK,确保正确;

2. 旧版本OBS Java SDK的BUG,解决方法:升级SDK到最新版本;

3. OBS Java SDK 2.1.x版本与其依赖库Apache HttpClient的兼容性问题,解决方 法:使用固定版本的依赖库,httpcore-4.4.4和httpclient-4.5.3;

MethodNotAllowed 方法不允许

HTTP Code: 405

Error Code: MethodNotAllowed

此错误一般是请求的OBS服务端未上线ObsClient接口依赖的特性,请联系OBS运维团 队进行进一步确认。

BucketAlreadyOwnedByYou 创桶失败

HTTP Code: 409

Error Code: BucketAlreadyOwnedByYou

OBS中的桶要求全局唯一,即使在不同区域,也不允许出现同名桶。解决方法:若调 用ObsClient.createBucket接口出现该异常,请确认该桶是否已存在。您可通过如下两 种方式判断该桶是否已存在。

方式一(推荐):调用ObsClient.listBuckets接口查询您拥有的全部桶列表后判断该桶 是否已经存在;

方式二:调用ObsClient.headBucket接口判断该桶是否已经存在。

Java SDK 开发指南 6 问题定位

说明

ObsClient.headBucket接口只能访问到当前区域下的桶,而ObsClient.listBuckets接口能访问到 所有区域下的桶。

BucketAlreadyExists 创桶失败

HTTP Code: 409

Error Code: BucketAlreadyExists

OBS中的桶要求全局唯一,即使在不同区域,也不允许出现同名桶。解决方法:若调 用ObsClient.createBucket接口出现该异常,表明其他用户已创建了该桶,请换一个桶 名后重新创建。

连接超时

HTTP Code: 408

Caused by: java.net.ConnectException: Connection timed out: connect at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)

at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)

此类错误一般有三种原因:

1. 初始化ObsClient时传入的Endpoint有误,解决方法:检查Endpoint,确保正确;

2. 客户端到OBS服务端的网络异常,导致无法访问,解决方法:检查客户端到OBS 服务端的网络健康状况;

3. DNS解析出的OBS服务域名无法访问,解决方法:联系OBS运维团队;

读写超时

HTTP Code: 408

Error Code:RequestTimeOut

Caused by: java.net.SocketTimeoutException: timeout at okio.Okio$4.newTimeoutException(Okio.java:232) at okio.AsyncTimeout.exit(AsyncTimeout.java:285) at okio.AsyncTimeout$2.read(AsyncTimeout.java:241)

此类错误一般有两种原因:

1. 客户端到OBS服务端的网络时延过大,解决方法:检查客户端到OBS服务端的网 络健康状况;

2. 客户端到OBS服务端的网络异常,导致无法访问,解决方法:检查客户端到OBS 服务端的网络健康状况;

异常返回值为-1

HTTP Code: -1

此类错误一般有三种原因:

1. 使用了旧版的OBS Java SDK并且发生了连接超时或读写超时的异常,解决方法:

参见连接超时和读写超时的解决方法;

2. 旧版OBS Java SDK的BUG,解决方法:升级到最新版本的SDK,可以从这里下载 最新版本;

3. 服务端返回了异常的结果,导致SDK解析返回结果时出现了不可预期的错误,解 决方法:尝试从日志中获取OBS服务端请求ID,并联系OBS运维团队;

Java SDK 开发指南 6 问题定位

ObsException 中无法获取错误码

此类错误一般有两种原因:

1. 调用ObsClient.getBucketMetadata或ObsClient.getObjectMetadata报错,此种 场景下由于后台使用的是HEAD请求,服务端不会返回错误码,解决方法:使用 ObsException.getResponseCode获取HTTP状态码,根据状态码分析可能原因,

如403一般代表无权限访问,404一般代表桶或对象不存在;如无法定位原因,可 从ObsException中获取OBS服务端请求ID后联系OBS运维团队;

2. 初始化ObsClient时传入的Endpoint通过DNS解析后的IP不是有效的OBS服务端,

解决方法:检查Endpoint配置是否正确,如Endpoint确认无误,联系OBS运维团 队;

UnknownHostException 域名无法解析异常

Caused by: java.net.UnknownHostException: bucketname.unknowndomain.com at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)

at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:901)

at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1293)

此类错误一般有两种原因:

1. 初始化ObsClient时传入的Endpoint有误,解决方法:检查Endpoint,确保正确;

2. DNS无法解析OBS服务域名,解决方法:联系OBS运维团队;

NullPointException 空指针异常

Exception in thread "main" java.lang.NullPointerException

at com.obs.services.internal.RestStorageService.isCname(RestStorageService.java:1213) at com.obs.services.ObsClient.doActionWithResult(ObsClient.java:2805)

此类错误一般有两种原因:

1. 使用ObsClient.close接口关闭ObsClient后,再次调用ObsClient的其他接口,解决 方法:仅在应用程序退出前调用ObsClient.close接口释放资源;

2. 旧版OBS Java SDK的BUG,解决方法:升级到最新版本的SDK,可以从这里下载 最新版本;

连接泄露问题

A connection to xxx was leaked. Did you forget to close a response body?

此错误通常是调用ObsClient.getObject接口获取下载对象的数据流后未正常关闭,解 决方法:确保在finally语句块中调用了ObsObject.getObjectContent.close方法关闭连 接。

旧版本 SDK 升级问题

由于旧版SDK(2.1.x)与新版SDK(3.x)第三方依赖库不完全兼容,如果从旧版SDK 升级到新版SDK后出现程序启动报错,请参考依赖缺失和依赖冲突的解决;如果仍无 法解决,请联系OBS运维团队。

其他问题

请参考FAQ,查看更多问题的解决方法。

Java SDK 开发指南 6 问题定位

7 管理桶

7.1 创建桶

须知

开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论 坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。

您可以通过ObsClient.createBucket创建桶。

简单创建

以下代码展示如何新建一个桶:

String endPoint = "https://your-endpoint";

String ak = "*** Provide your Access Key ***";

String sk = "*** Provide your Secret Key ***";

// 创建ObsClient实例

ObsClient obsClient = new ObsClient(ak, sk, endPoint);

// 创建桶 try{ // 创建桶成功

ObsBucket bucket = obsClient.createBucket("bucketname");

System.out.println(bucket.getRequestId());

}catch (ObsException e) { // 创建桶失败

System.out.println("HTTP Code: " + e.getResponseCode());

System.out.println("Error Code:" + e.getErrorCode());

System.out.println("Error Message: " + e.getErrorMessage());

System.out.println("Request ID:" + e.getErrorRequestId());

System.out.println("Host ID:" + e.getErrorHostId());

}

Java SDK 开发指南 7 管理桶

说明

禁止两个“.”相邻(如:“my..bucket”)。

禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。

● 同一用户在同一个区域多次创建同名桶不会报错,创建的桶属性以第一次请求为准。

● 本示例创建的桶的访问权限默认是私有读写,存储类型默认是标准类型,区域位置是默认区 域华北-北京一(cn-north-1)。

须知

● 创建桶时,如果使用的终端节点归属于默认区域华北-北京一(cn-north-1),则可 以不指定区域;如果使用的终端节点归属于其他区域,则必须指定区域,且指定的

String endPoint = "https://your-endpoint";

String ak = "*** Provide your Access Key ***";

String sk = "*** Provide your Secret Key ***";

// 创建ObsClient实例

ObsClient obsClient = new ObsClient(ak, sk, endPoint);

CreateBucketRequest request = new CreateBucketRequest();

request.setBucketName("bucketname");

ObsBucket bucket = obsClient.createBucket(request);

System.out.println(bucket.getRequestId());

}catch (ObsException e) { // 创建桶失败

System.out.println("HTTP Code: " + e.getResponseCode());

System.out.println("Error Code:" + e.getErrorCode());

System.out.println("Error Message: " + e.getErrorMessage());

System.out.println("Request ID:" + e.getErrorRequestId());

System.out.println("Host ID:" + e.getErrorHostId());

}

Java SDK 开发指南 7 管理桶

说明

● 并不是所有区域都支持创建多AZ桶,你可以在产品价格详情页面,查询指定区域是否支持多 AZ。