须知
开发过程中,您有任何问题可以在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。