1313import java .util .Arrays ;
1414import java .util .Collections ;
1515import java .util .HashSet ;
16+ import java .util .Map ;
1617import java .util .Set ;
1718
1819public class DefaultRetryCondition extends RetryCondition {
@@ -52,8 +53,16 @@ public boolean shouldRetry(ApiResponse response, ApiException apiException) {
5253 if (response != null ) {
5354 statusCode = response .getStatusCode ();
5455 if (response .getData () != null ) {
55- AbstractResponse abstractResponse = (AbstractResponse )response .getData ();
56- errorCode = getErrorCode (abstractResponse .getResponseMetadata ());
56+ if (response .getData () instanceof AbstractResponse ) {
57+ AbstractResponse abstractResponse = (AbstractResponse )response .getData ();
58+ errorCode = getErrorCode (abstractResponse .getResponseMetadata ());
59+ }
60+
61+ if (response .getData () instanceof Map ){
62+ Map <String , Object > map = (Map <String , Object >)response .getData ();
63+ errorCode = getErrorCodeFromMap (map , String .class ,"ResponseMetadata" , "Error" , "Code" );
64+ }
65+
5766 }
5867 }
5968
@@ -68,6 +77,29 @@ public boolean shouldRetry(ApiResponse response, ApiException apiException) {
6877 return false ;
6978 }
7079
80+ private <T > T getErrorCodeFromMap (Map <String , Object > map , Class <T > responseType , String ... keys ) {
81+ if (map == null || keys == null || keys .length == 0 ) {
82+ return null ;
83+ }
84+ Map <String , Object > currentMap = map ;
85+ for (int i = 0 ; i < keys .length ; i ++) {
86+ String key = keys [i ];
87+ if (!currentMap .containsKey (key )){
88+ break ;
89+ }
90+ Object value = currentMap .get (key );
91+ if (i < keys .length - 1 ) { // 还没到最后一层
92+ if (!(value instanceof Map )){
93+ return null ;
94+ }
95+ currentMap = (Map <String , Object >) value ;
96+ }else {
97+ return responseType .cast (value );
98+ }
99+ }
100+ return null ;
101+ }
102+
71103 private String getErrorCode (ResponseMetadata responseMetadata ) {
72104 if (responseMetadata != null && responseMetadata .getError () != null ) {
73105 return responseMetadata .getError ().getCode ();
0 commit comments