Skip to content

[ANDROID][Volley] UnsupportedEncodingException not catch by ApiInvoker #6432

@ecolleu

Description

@ecolleu
Description

When generating an Android client (volley library) with swagger-codegen, the compilation failed with:

    [javac] Compiling 46 source files to bin/classes
    [javac] v1/ApiInvoker.java:448: error: unreported exception UnsupportedEncodingException; must be caught or declared to be thrown
    [javac]           request = new PostRequest(url, headers, contentType, new StringEntity(formParamStr, "UTF-8"), stringRequest, errorListener);
    [javac]                                                                ^
    [javac] v1/ApiInvoker.java:453: error: unreported exception UnsupportedEncodingException; must be caught or declared to be thrown
    [javac]              request = new PostRequest(url, headers, contentType, new StringEntity(serialize(body), "UTF-8"), stringRequest, errorListener);
    [javac]                                                                   ^
    [javac] v1/ApiInvoker.java:462: error: unreported exception UnsupportedEncodingException; must be caught or declared to be thrown
    [javac]           request = new PutRequest(url, headers, contentType, new StringEntity(formParamStr, "UTF-8"), stringRequest, errorListener);
    [javac]                                                               ^
    [javac] v1/ApiInvoker.java:467: error: unreported exception UnsupportedEncodingException; must be caught or declared to be thrown
    [javac]              request = new PutRequest(url, headers, contentType, new StringEntity(serialize(body), "UTF-8"), stringRequest, errorListener);
    [javac]                                                                  ^
    [javac] v1/ApiInvoker.java:476: error: unreported exception UnsupportedEncodingException; must be caught or declared to be thrown
    [javac]            request = new DeleteRequest(url, headers, contentType, new StringEntity(formParamStr, "UTF-8"), stringRequest, errorListener);
    [javac]                                                                   ^
    [javac] v1/ApiInvoker.java:481: error: unreported exception UnsupportedEncodingException; must be caught or declared to be thrown
    [javac]              request = new DeleteRequest(url, headers, contentType, new StringEntity(serialize(body), "UTF-8"), stringRequest, errorListener);
    [javac]                                                                     ^
    [javac] v1/ApiInvoker.java:490: error: unreported exception UnsupportedEncodingException; must be caught or declared to be thrown
    [javac]              request = new PatchRequest(url, headers, contentType, new StringEntity(formParamStr, "UTF-8"), stringRequest, errorListener);
    [javac]                                                                    ^
    [javac] v1/ApiInvoker.java:495: error: unreported exception UnsupportedEncodingException; must be caught or declared to be thrown
    [javac]                 request = new PatchRequest(url, headers, contentType, new StringEntity(serialize(body), "UTF-8"), stringRequest, errorListener);
    [javac]                                                                       ^
    [javac] Note: v1/ApiInvoker.java uses unchecked or unsafe operations.
    [javac] Note: Recompile with -Xlint:unchecked for details.
    [javac] 8 errors

The problem comes from the StringEntity constructor which can throw UnsupportedEncodingException which is not catched nor thrown by the createRequest method.

Swagger-codegen version

2.2.3

Suggest a fix/enhancement
--- a/modules/swagger-codegen/src/main/resources/android/libraries/volley/apiInvoker.mustache
+++ b/modules/swagger-codegen/src/main/resources/android/libraries/volley/apiInvoker.mustache
@@ -363,24 +363,32 @@ public class ApiInvoker {
   }
 
   public String invokeAPI(String host, String path, String method, List<Pair> queryParams, Object body, Map<String, String> headerParams, Map<String, String> formParams, String contentType, String[] authNames) throws ApiException, InterruptedException, ExecutionException, TimeoutException {
-    RequestFuture<String> future = RequestFuture.newFuture();
-    Request request = createRequest(host, path, method, queryParams, body, headerParams, formParams, contentType, authNames, future, future);
-    if(request != null) {
-       mRequestQueue.add(request);
-       return future.get(connectionTimeout, TimeUnit.SECONDS);
-    } else {
-      return "no data";
+    try {
+      RequestFuture<String> future = RequestFuture.newFuture();
+      Request request = createRequest(host, path, method, queryParams, body, headerParams, formParams, contentType, authNames, future, future);
+      if(request != null) {
+         mRequestQueue.add(request);
+         return future.get(connectionTimeout, TimeUnit.SECONDS);
+      } else {
+        return "no data";
+      }
+    } catch (UnsupportedEncodingException ex) {
+      throw new ApiException();
     }
   }
 
   public void invokeAPI(String host, String path, String method, List<Pair> queryParams, Object body, Map<String, String> headerParams, Map<String, String> formParams, String contentType, String[] authNames, Response.Listener<String> stringRequest, Response.ErrorListener errorListener) throws ApiException {
-    Request request = createRequest(host, path, method, queryParams, body, headerParams, formParams, contentType, authNames, stringRequest, errorListener);
-    if (request != null) {
-      mRequestQueue.add(request);
+    try {
+      Request request = createRequest(host, path, method, queryParams, body, headerParams, formParams, contentType, authNames, stringRequest, errorListener);
+      if (request != null) {
+        mRequestQueue.add(request);
+      }
+    } catch (UnsupportedEncodingException ex) {
+      throw new ApiException();
     }
   }
 
-  public Request<String> createRequest(String host, String path, String method, List<Pair> queryParams, Object body, Map<String, String> headerParams, Map<String, String> formParams, String contentType, String[] authNames, Response.Listener<String> stringRequest, Response.ErrorListener errorListener) throws ApiException {
+  public Request<String> createRequest(String host, String path, String method, List<Pair> queryParams, Object body, Map<String, String> headerParams, Map<String, String> formParams, String contentType, String[] authNames, Response.Listener<String> stringRequest, Response.ErrorListener errorListener) throws ApiException, UnsupportedEncodingException {
     StringBuilder b = new StringBuilder();
     b.append("?");

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions