diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/RestMethodHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/RestMethodHandler.java index 662dec0cb4..8dc73b57b7 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/RestMethodHandler.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/RestMethodHandler.java @@ -228,31 +228,36 @@ private JFieldRef setCookies(ExecutableElement executableElement, RestHolder res * that it behaves as it did previous to this feature. */ private void insertRestTryCatchBlock(RestHolder holder, JBlock body, JExpression returnCall, boolean methodReturnVoid) { - JTryBlock tryBlock = body._try(); + JBlock returnCallBody = body; - if (methodReturnVoid) { - tryBlock.body().add((JInvocation) returnCall); - } else { - tryBlock.body()._return(returnCall); - } + if (holder.getRestErrorHandlerField() != null) { + JTryBlock tryBlock = body._try(); + returnCallBody = tryBlock.body(); + + JCatchBlock jCatch = tryBlock._catch(classes().REST_CLIENT_EXCEPTION); - JCatchBlock jCatch = tryBlock._catch(classes().REST_CLIENT_EXCEPTION); + JBlock catchBlock = jCatch.body(); + JConditional conditional = catchBlock._if(JOp.ne(holder.getRestErrorHandlerField(), JExpr._null())); + JVar exceptionParam = jCatch.param("e"); - JBlock catchBlock = jCatch.body(); - JConditional conditional = catchBlock._if(JOp.ne(holder.getRestErrorHandlerField(), JExpr._null())); - JVar exceptionParam = jCatch.param("e"); + JBlock thenBlock = conditional._then(); - JBlock thenBlock = conditional._then(); + // call the handler method if it was set. + thenBlock.add(holder.getRestErrorHandlerField().invoke("onRestClientExceptionThrown").arg(exceptionParam)); - // call the handler method if it was set. - thenBlock.add(holder.getRestErrorHandlerField().invoke("onRestClientExceptionThrown").arg(exceptionParam)); + // return null if exception was caught and handled. + if (!methodReturnVoid) { + thenBlock._return(JExpr._null()); + } - // return null if exception was caught and handled. - if (!methodReturnVoid) { - thenBlock._return(JExpr._null()); + // re-throw the exception if handler wasn't set. + conditional._else()._throw(exceptionParam); } - // re-throw the exception if handler wasn't set. - conditional._else()._throw(exceptionParam); + if (methodReturnVoid) { + returnCallBody.add((JInvocation) returnCall); + } else { + returnCallBody._return(returnCall); + } } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/RestHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/RestHolder.java index 0d357eb880..51364dec85 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/RestHolder.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/RestHolder.java @@ -178,6 +178,7 @@ private void implementSetErrorHandler(List methods) { JMethod setErrorHandlerMethod = codeModelHelper.implementMethod(this, methods, "setRestErrorHandler", TypeKind.VOID.toString(), RestErrorHandler.class.getName()); if (setErrorHandlerMethod != null) { + setRestErrorHandlerField(); setErrorHandlerMethod.body().assign(_this().ref(getRestErrorHandlerField()), setErrorHandlerMethod.params().get(0)); } } @@ -256,9 +257,7 @@ private void setAuthenticationField() { } public JFieldVar getRestErrorHandlerField() { - if (restErrorHandlerField == null) { - setRestErrorHandlerField(); - } + // restErrorHandlerField is created only if the method setRestErrorHandler is implemented return restErrorHandlerField; } diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/rest/HttpMethodsService.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/rest/HttpMethodsService.java index 93b95d8602..fbdc053e08 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/rest/HttpMethodsService.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/rest/HttpMethodsService.java @@ -24,6 +24,8 @@ import org.androidannotations.annotations.rest.Post; import org.androidannotations.annotations.rest.Put; import org.androidannotations.annotations.rest.Rest; +import org.androidannotations.api.rest.RestClientErrorHandling; +import org.androidannotations.api.rest.RestErrorHandler; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter; @@ -31,7 +33,7 @@ // if defined, the rootUrl will be added as a prefix to every request @Rest(rootUrl = "http://company.com/ajax/services", converters = { MappingJacksonHttpMessageConverter.class }, interceptors = { RequestInterceptor.class }) -public interface HttpMethodsService { +public interface HttpMethodsService extends RestClientErrorHandling { @Delete("/delete/") void delete();