全部產品
Search
文件中心

Object Storage Service:Java常見問題

更新時間:Jun 19, 2024

本文介紹使用OSS Java SDK的常見問題及解決方案。

包衝突

  • 錯誤原因

    使用OSS Java SDK時,報類似如下錯誤,說明工程中可能有包衝突。

    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/ssl/TrustStrategy
        at com.aliyun.oss.OSSClient.<init>(OSSClient.java:268)
        at com.aliyun.oss.OSSClient.<init>(OSSClient.java:193)
        at com.aliyun.oss.demo.HelloOSS.main(HelloOSS.java:77)
    Caused by: java.lang.ClassNotFoundException: org.apache.http.ssl.TrustStrategy
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        ... 3 more
                        

    Exception in thread "main" java.lang.NoSuchFieldError: INSTANCE
     at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:52)
     at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:56)
     at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<clinit>(DefaultHttpRequestWriterFactory.java:46)
     at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:82)
     at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:95)
     at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:104)
     at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<clinit>(ManagedHttpClientConnectionFactory.java:62)
     at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$InternalConnectionFactory.<init>(PoolingHttpClientConnectionManager.java:572)
     at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:174)
     at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:158)
     at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:149)
     at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:125)
     at com.aliyun.oss.common.comm.DefaultServiceClient.createHttpClientConnectionManager(DefaultServiceClient.java:237)
     at com.aliyun.oss.common.comm.DefaultServiceClient.<init>(DefaultServiceClient.java:78)
     at com.aliyun.oss.OSSClient.<init>(OSSClient.java:268)
     at com.aliyun.oss.OSSClient.<init>(OSSClient.java:193)
     at OSSManagerImpl.upload(OSSManagerImpl.java:42)
     at OSSManagerImpl.main(OSSManagerImpl.java:63)
                        

    錯誤原因是OSS Java SDK使用了Apache HttpClient 4.4.1,而您的工程使用了與Apache HttpClient 4.4.1衝突的Apache HttpClient或commons-httpclient jar包。要查看工程使用的jar包及版本,請在您的工程目錄下執行mvn dependency:tree。如下圖所示,您的工程裡使用了Apache HttpClient 4.3:

  • 解決方案

    包衝突有以下兩種解決方案:

    • 使用統一版本。如果您的工程使用與Apache HttpClient 4.4.1衝突的版本,請您使用4.4.1版本,並在pom.xml刪除其它版本的Apache HttpClient依賴。如果您的工程使用了commons-httpclient,也可能存在衝突,請刪除commons-httpclient。

    • 解決依賴衝突。如果您的工程依賴多個第三方包,而第三方包又依賴不同版本的Apache HttpClient,您的工程裡會有依賴衝突,請使用exclusion解除。更多資訊,請參見Maven Guides

    OSS Java SDK依賴以下版本的包,衝突解決辦法與HttpClient類似。

缺少包

  • 錯誤原因

    使用OSS Java SDK時,報類似如下錯誤,說明您的工程中可能缺少編譯或運行OSS Java SDK所必需的包。

    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/auth/Credentials
            at com.aliyun.oss.OSSClient.<init>(OSSClient.java:268)
            at com.aliyun.oss.OSSClient.<init>(OSSClient.java:193)
            at com.aliyun.oss.demo.HelloOSS.main(HelloOSS.java:76)
    Caused by: java.lang.ClassNotFoundException: org.apache.http.auth.Credentials
            at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
            at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
            at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
            ... 3 more
                        

    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/protocol/HttpContext
            at com.aliyun.oss.OSSClient.<init>(OSSClient.java:268)
            at com.aliyun.oss.OSSClient.<init>(OSSClient.java:193)
            at com.aliyun.oss.demo.HelloOSS.main(HelloOSS.java:76)
    Caused by: java.lang.ClassNotFoundException: org.apache.http.protocol.HttpContext
            at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
            at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
            at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
            ... 3 more
                        

    Exception in thread "main" java.lang.NoClassDefFoundError: org/jdom/input/SAXBuilder
            at com.aliyun.oss.internal.ResponseParsers.getXmlRootElement(ResponseParsers.java:645)
            at … … 
            at com.aliyun.oss.OSSClient.doesBucketExist(OSSClient.java:471)
            at com.aliyun.oss.OSSClient.doesBucketExist(OSSClient.java:465)
            at com.aliyun.oss.demo.HelloOSS.main(HelloOSS.java:82)
    Caused by: java.lang.ClassNotFoundException: org.jdom.input.SAXBuilder
            at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
            at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
            at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
            ... 11 more
                        

    OSS Java SDK依賴下列包:

    • aliyun-sdk-oss-2.2.1.jar

    • hamcrest-core-1.1.jar

    • jdom-1.1.jar

    • commons-codec-1.9.jar

    • httpclient-4.4.1.jar

    • commons-logging-1.2.jar

    • httpcore-4.4.1.jar

    • log4j-1.2.15.jar

    其中log4j-1.2.15.jar是可選的,需要日誌功能的時候加入該包,其它包都是必需的。

  • 解決方案

    在您的工程中加入OSS Java SDK依賴的包。加入方法如下:

    • 如果您的工程在Eclipse中,請參見Java SDK使用手冊中的安裝方式二。

    • 如果您的工程在Ant中,請把OSS Java SDK依賴的包放入工程的lib目錄中。

    • 如果您直接使用.javac或.java檔案,請使用-classpath-cp命令指定OSS Java SDK依賴的包路徑,或把OSS Java SDK依賴的包放入classpath路徑下。

連線逾時

  • 錯誤原因

    運行OSS Java SDK程式時報如下類似錯誤,可能原因是Endpoint錯誤或者網路不通。

    com.aliyun.oss.ClientException: SocketException
        at com.aliyun.oss.common.utils.ExceptionFactory.createNetworkException(ExceptionFactory.java:71)
        at com.aliyun.oss.common.comm.DefaultServiceClient.sendRequestCore(DefaultServiceClient.java:116)
        at com.aliyun.oss.common.comm.ServiceClient.sendRequestImpl(ServiceClient.java:121)
        at com.aliyun.oss.common.comm.ServiceClient.sendRequest(ServiceClient.java:67)
        at com.aliyun.oss.internal.OSSOperation.send(OSSOperation.java:92)
        at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:140)
        at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:111)
        at com.aliyun.oss.internal.OSSBucketOperation.getBucketInfo(OSSBucketOperation.java:1152)
        at com.aliyun.oss.OSSClient.getBucketInfo(OSSClient.java:1220)
        at com.aliyun.oss.OSSClient.getBucketInfo(OSSClient.java:1214)
        at com.aliyun.oss.demo.HelloOSS.main(HelloOSS.java:94)
    Caused by: org.apache.http.conn.HttpHostConnectException: Connect to oss-test.oss-cn-hangzhou-internal.aliyuncs.com:80 [oss-test.oss-cn-hangzhou-internal.aliyuncs.com/10.84.135.99] failed: Connection timed out: connect
        at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:151)
        at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353)
        at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380)
        at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
        at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
        at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
        at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
        at com.aliyun.oss.common.comm.DefaultServiceClient.sendRequestCore(DefaultServiceClient.java:113)
        ... 9 more
                        
  • 解決方案

    您可以使用ossutil工具快速定位錯誤原因並解決問題。

報錯SignatureDoesNotMatch

  • 錯誤原因1

    AccessKey ID和AccessKey Secret不一致。

    有關擷取AccessKey ID和AccessKey Secret的操作步驟,請參見建立AccessKey

  • 錯誤原因2

    簽名URL使用不正確。錯誤樣本如下:

    GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, object);
    request.setExpiration( new Date(new Date().getTime() + 3600 * 1000));
    request.addUserMetadata("author");
    URL url = ossClient.generatePresignedUrl(request);
    
    Map<String, String> header = new HashMap<String, String>();
    header.put("author");
    ossClient.putObject(url, new ByteArrayInputStream("Hello OSS".getBytes()), -1, header);

    未指定Method參數時,預設使用GET方法。以上為PutObject請求,應指定Method參數並設定為PUT方法。

    通過PutObject發送請求時,請求Header中自訂的中繼資料必須以x-oss-meta-為首碼。以上樣本中自訂中繼資料應改為x-oss-meta-author

    解決方案:

    指定Method,並修改Header:

    request.addUserMetadata("author");
    request.setMethod(HttpMethod.PUT);
    URL url = ossClient.generatePresignedUrl(request);
    
    Map<String, String> header = new HashMap<String, String>();
    header.put("x-oss-meta-" + "author");
    ossClient.putObject(url, new ByteArrayInputStream("Hello OSS".getBytes()), -1, header);
  • 錯誤原因3

    • 使用了低於3.7.0版本的OSS SDK,專案中引入了4.5.9及以上版本的HttpClient。

    • 上傳的檔案名稱中包含+字元,而4.5.9版本的HttpClient不會對+進行URLEncode編碼,從而造成用戶端與服務端計算的簽名不一致而報錯。

    1

    解決方案:

    • OSS SDK建議升級為3.11.1及以上版本, 以相容4.5.9版本的HttpClient。

    • 移除多餘的HttpClient依賴。引入OSS SDK時會自動引入HttpClient依賴,如果是第三方庫另外引入了HttpClient,請參見包衝突解決方案。

  • 錯誤原因4

    HttpClient 4.5.10版本不支援Header中包含ISO/9959-1標準以外的字元,但在專案中引入了4.5.10以上的httpclient,並在請求Header中包含了ISO/9959-1標準以外的字元,例如x-oss-meta-開頭的自訂中繼資料中傳入了中文字元。3

    解決方案:

    • 參見包衝突解決方案,移除衝突的HttpClient版本。

    • 在請求Header中傳入符合ISO/9959-1標準的字元。

報異常“Failed to parse the response result”

FAQ3

  • 錯誤原因

    用戶端某些特殊的軟體攔截了HTTP請求,或者公網路由劫持了HTTP請求。

    在Java 11上使用OSS Java SDK,且未在pom.xml檔案中添加JAXB相關依賴。

  • 解決方案

    切換為HTTPS請求。

    添加JAXB相關依賴。操作步驟,請參見安裝SDK

org.apache.http.NoHttpResponseException: The target server failed to respond

  • 錯誤原因

    運行OSS Java SDK程式時,報類似如下錯誤:

    使用到期的串連會導致上述錯誤,該錯誤僅在Java SDK 2.1.2之前的版本出現。

  • 解決方案

    請升級OSS Java SDK到2.1.2及以後版本。

JVM中存在大量org.apache.http.impl.conn.PoolingHttpClientConnectionManager執行個體

  • 錯誤原因

    ossClient沒有關閉導致。

  • 解決方案

    主動關閉已執行完畢的ossClient或使用單例模式。

調用OSS Java SDK不響應

  • 錯誤原因

    調用OSS Java SDK不響應。通過jstack -l pid命令查看堆棧,問題出現在如下的位置:

    "main" prio=6 tid=0x000000000291e000 nid=0xc40 waiting on condition [0x0000000002dae000]
    java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000007d85697f8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
        at org.apache.http.pool.PoolEntryFuture.await(PoolEntryFuture.java:138)
        at org.apache.http.pool.AbstractConnPool.getPoolEntryBlocking(AbstractConnPool.java:306)
        at org.apache.http.pool.AbstractConnPool.access$000(AbstractConnPool.java:64)
        at org.apache.http.pool.AbstractConnPool$2.getPoolEntry(AbstractConnPool.java:192)
        at org.apache.http.pool.AbstractConnPool$2.getPoolEntry(AbstractConnPool.java:185)
        at org.apache.http.pool.PoolEntryFuture.get(PoolEntryFuture.java:107)
        at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.leaseConnection(PoolingHttpClientConnectionManager.java:276)
        at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$1.get(PoolingHttpClientConnectionManager.java:263)
        at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:190)
        at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
        at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
        at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
        at com.aliyun.oss.common.comm.DefaultServiceClient.sendRequestCore(DefaultServiceClient.java:113)
        at com.aliyun.oss.common.comm.ServiceClient.sendRequestImpl(ServiceClient.java:123)
        at com.aliyun.oss.common.comm.ServiceClient.sendRequest(ServiceClient.java:68)
        at com.aliyun.oss.internal.OSSOperation.send(OSSOperation.java:94)
        at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:146)
        at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:113)
        at com.aliyun.oss.internal.OSSObjectOperation.getObject(OSSObjectOperation.java:229)
        at com.aliyun.oss.OSSClient.getObject(OSSClient.java:629)
        at com.aliyun.oss.OSSClient.getObject(OSSClient.java:617)
        at samples.HelloOSS.main(HelloOSS.java:49)
                        

    原因是串連池中串連泄漏,可能是使用ossObject後沒有關閉。

  • 解決方案

    請檢查您的程式,確保沒有串連泄漏。關閉方法如下:

    // 讀取檔案
    OSSObject ossObject = ossClient.getObject(bucketName, objectName);
    // OSS操作
    // 關閉ossObject
    ossObject.close();
                        

串連關閉

  • 錯誤原因

    如果您在使用ossClient.getObject時,報類似如下錯誤:

    Exception in thread "main" org.apache.http.ConnectionClosedException: Premature end of Content-Length delimited message body (expected: 11990526; received: 202880)
        at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:180)
        at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:200)
        at org.apache.http.impl.io.ContentLengthInputStream.close(ContentLengthInputStream.java:103)
        at org.apache.http.impl.execchain.ResponseEntityProxy.streamClosed(ResponseEntityProxy.java:128)
        at org.apache.http.conn.EofSensorInputStream.checkClose(EofSensorInputStream.java:228)
        at org.apache.http.conn.EofSensorInputStream.close(EofSensorInputStream.java:174)
        at java.io.FilterInputStream.close(FilterInputStream.java:181)
        at java.io.FilterInputStream.close(FilterInputStream.java:181)
        at com.aliyun.oss.event.ProgressInputStream.close(ProgressInputStream.java:147)
        at java.io.FilterInputStream.close(FilterInputStream.java:181)
        at samples.HelloOSS.main(HelloOSS.java:39)
                        

    原因是兩次讀取資料間隔時間超過1分鐘。OSS會關閉超過1分鐘沒有發送或接收資料的串連。

  • 解決方案

    如果您每次僅讀取部分資料,且處理資料的時間不固定,建議使用指定範圍讀取,避免資料讀取時串連關閉。當範圍下載完成後,串連將關閉。更多資訊,請參見範圍下載

記憶體泄露

  • 錯誤原因

    調用OSS Java SDK的程式,運行一段時間(根據業務量,幾小時到幾天不等)後記憶體泄露。 推薦使用Eclipse Memory Analyzer (MAT)分析記憶體使用量情況。更多資訊,請參見使用MAT進行堆轉儲檔案分析

    如果分析結果類似下圖所示(PoolingHttpClientConnectionManager佔96%的記憶體),原因是程式中可能多次執行new OSSClient,但是沒有調用ossClient.shutdown,造成記憶體流失。

  • 解決方案

    new OSSClient操作完成後,請通過shutdown進行關閉,保證new OSSClient和ossClient.shutdown成對使用。

調用ossClient.shutdown報異常InterruptedException

  • 錯誤原因

    OSS Java SDK 2.3.0之前的版本在調用ossClient.shutdown時報如下異常:

    java.lang.InterruptedException: sleep interrupted
            at java.lang.Thread.sleep(Native Method)
            at com.aliyun.oss.common.comm.IdleConnectionReaper.run(IdleConnectionReaper:76)
                        

    原因是ossClient後台線程IdleConnectionReaper會定時關閉閑置串連。IdleConnectionReaper在Sleep時,調用ossClient.shutdown,就會報上面的異常。

  • 解決方案

    使用如下代碼,忽略該異常:

    try {
        ossClient.shutdown();
    } catch(Exception e) {
    }
                        

請求出現異常“SDK.ServerUnreachable : Speicified endpoint or uri is not valid”

  • 錯誤原因

    • 使用者端並發請求STS過高。

    • 網路到Server端逾時。

    • 所使用的STS SDK以及SDK core不是最新版本。

  • 解決方案

    • 使用者端並發請求STS過高,而使用者端的ECS或者本地PC不足以承載當時的並發,降低OSS並發。

    • 使用者的網路到Server端有逾時現象可以進行抓包驗證。

    • 建議將STS SDK及SDK core升級至最新版本。

NoSuchKey

  • 錯誤原因

    源檔案不存在。

  • 解決方案

    參見404錯誤

SocketException

  • 錯誤原因

    可能是socket在init階段就失敗了,導致請求沒有到達OSS。

  • 解決方案

    建議從以下幾個方面進行排查:

    • 出現問題時是否出現網路抖動。

    • 主機的socket串連數是否佔滿。

    • 確認出現問題時串連數是否超過SDK中設定的maxconnection,如果串連數超過maxconnection設定,也會出現socket異常。

    如果以上都沒有問題,建議您部署tcpdump或者Wireshark抓包,問題複現後再分析資料包。

使用OSS PostObject的callback沒有觸發回調

使用OSS PostObject的callback沒有觸發回調,但是通過PutObject用同樣的callback觸發了回調。一般情況下,如果JSON格式有誤或者回調失敗,都會返回相應的訊息,這裡需要分別測試Put和Post回調效果:

  • 錯誤原因

    發送請求時callback參數在file下面。

  • 解決方案

    調整callback參數與file的位置。

    此時測試結果顯示商務服務器成功抓取請求。

Connection pool shut down

Caused by: java.lang.IllegalStateException: Connection pool shut down
  at org.apache.http.util.Asserts.check(Asserts.java:34)
  at org.apache.http.pool.AbstractConnPool.lease(AbstractConnPool.java:184)
  at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.requestConnection(PoolingHttpClientConnectionManager.java:251)
  at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:175)
  at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
  at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
  at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
  at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
  at com.aliyun.oss.common.comm.DefaultServiceClient.sendRequestCore(DefaultServiceClient.java:124)
  at com.aliyun.oss.common.comm.ServiceClient.sendRequestImpl(ServiceClient.java:133)
  ... 8 more
  • 錯誤原因

    調用ossClient.shutdown()介面後,還繼續通過ossClient發送請求。

  • 解決方案

    請檢查調用邏輯,確保調用了ossClient.shutdown()介面之後,不再通過ossClient發送請求。

使用Java SDK的generatePresignedUrl產生的請求報錯Request has expired

  • 錯誤原因

    int類型溢出,導致2038年時間戳記問題。

    超出URL設定的到期時間後發起上傳請求。

  • 解決方案

    如果是int類型溢出,建議Java SDK中到期時間長度不要超過2038年。

    如果因超出URL設定的到期時間後發起上傳請求,建議設定合理的到期時間,確保到期時間大於您發起請求的時間。

報錯Invalid Response或Implementation of JAXB-API has not been found on module path or classpath

  • 錯誤原因

    使用了Java 9以上的版本,並且沒有添加JAXB依賴。

  • 解決方案

    關於如何添加JAXB依賴的更多資訊,請參見安裝SDK

OSS Java SDK是否多安全執行緒?

是的,OSS Java SDK多安全執行緒。

報錯AccessDenied Hierarchical namespace is disabled

  • 錯誤原因

    調用CreateDirectoryRename或者DeleteDirectory介面前未開啟階層命名空間。

  • 解決方案

    建立Bucket時開啟階層命名空間。具體步驟,請參見建立儲存空間

用戶端網路正常,但是通過HTTP訪問時報錯Connection reset,如何處理?

部分地區的電訊廠商可能會對OSS的網域名稱進行劫持,建議通過Endpoint的方式配置為HTTPS協議。更多資訊,請參見配置OSSClient

Java 17 Cannot invoke "java.lang.reflect.Method.invoke(Object, Object[])" because "com.sun.xml.bind.v2.runtime.reflect.opt.Injector.defineClass" is null

  • 問題原因

    JAXB在Java 9中被標記為棄用並在Java 11中被刪除。

  • 解決方案

    添加以下依賴。

        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.messaging.saaj</groupId>
            <artifactId>saaj-impl</artifactId>
            <version>1.5.1</version>
        </dependency>

Java SDK如何配置內部日誌列印?

Java SDK列印日誌採用的是Apache Commons Logging(JCL)日誌架構。JCL可以選擇多種日誌實現架構(具體參見:JCL-Configuration),比較常見的是JCL over log4j或者JCL over SLF4j兩種,相關實現方式如下:

  • JCL over log4j: 您需要引入log4j的依賴(log4j 2.x有多種實現架構可以選,預設是log4j-api+log4j-core),並按log4j的配置方式進行配置,具體流程參考APACHE LOG4J-API Separation

  • JCL over slf4j: 您需要引入jcl-over-slf4j 和slf4j的依賴(slf4j也有多種實現架構可選,比如slf4j-api+logback-classic),並按照slf4j的配置方式進行配置,具體流程參考SJF4J-Bridging legacy APIs

Apache Log4j定義了不同層級的日誌,包括OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE和ALL。

通過配置log4j的屬性選擇開啟或者關閉SDK日誌:

FAQ1

其他錯誤

更多錯誤排查,請參見OSS錯誤響應