Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enable error handling in Java WebClient library, fixes #1243 #1244

Merged
merged 2 commits into from
Feb 19, 2019

Conversation

lukstei
Copy link
Contributor

@lukstei lukstei commented Oct 15, 2018

PR checklist

  • Read the contribution guidelines.
  • Ran the shell script under ./bin/ to update Petstore sample so that CIs can verify the change. (For instance, only need to run ./bin/{LANG}-petstore.sh and ./bin/security/{LANG}-petstore.sh if updating the {LANG} (e.g. php, ruby, python, etc) code generator or {LANG} client's mustache templates). Windows batch files can be found in .\bin\windows\.
  • Filed the PR against the correct branch: master, 3.4.x, 4.0.x. Default: master.
  • Copied the technical committee to review the pull request if your PR is targeting a particular programming language.

Description of the PR

Enable error handling in Java WebClient library, fixes #1243.
Also now the generated Exception class ApiException is used.

Custom error handling behaviour can be defined in an overwriting class e.g.:

public class MyApiClient extends ApiClient {
  @Override
  protected <T> Mono<T> handleUnsuccessfulResponse(ClientResponse response) {
    return super.<T>handleUnsuccessfulResponse(response)
      .onErrorMap(errorcode(404), x -> new MyNotFoundException("Not found"));
  }

  private static Predicate<Throwable> errorcode(int errorCode) {
    return x -> x instanceof ApiException && ((ApiException) x).getCode() == errorCode;
  }
}

@bbdouglas @JFCote @sreeshas @jfiala @lukoyanov @cbornet @jeff9finger

@wing328
Copy link
Member

wing328 commented Oct 21, 2018

Thanks for the PR but your commit (as shown in the Commits tab) is not linked to your Github account, which means this PR won't count as your contribution in https://github.com/OpenAPITools/openapi-generator/graphs/contributors.

Let me know if you need help fixing it.

Ref: https://github.com/OpenAPITools/openapi-generator/wiki/FAQ#how-can-i-update-commits-that-are-not-linked-to-my-github-account

@wing328
Copy link
Member

wing328 commented Oct 21, 2018

cc @daonomic who's added the WebClient support.

@lukstei
Copy link
Contributor Author

lukstei commented Oct 21, 2018

Thanks for the PR but your commit (as shown in the Commits tab) is not linked to your Github account, which means this PR won't count as your contribution in https://github.com/OpenAPITools/openapi-generator/graphs/contributors.

Let me know if you need help fixing it.

Ref: https://github.com/OpenAPITools/openapi-generator/wiki/FAQ#how-can-i-update-commits-that-are-not-linked-to-my-github-account

Thanks for the info - fixed it

@wing328 wing328 modified the milestones: 3.3.2, 3.3.3 Oct 31, 2018
@cbornet
Copy link
Member

cbornet commented Oct 31, 2018

Spring has a built-in ResponseStatusException WebClientResponseException which should be used instead of ApiException

@wing328 wing328 modified the milestones: 3.3.3, 3.3.4 Nov 14, 2018
@wing328 wing328 modified the milestones: 3.3.4, 4.0.0 Nov 30, 2018
@cbornet
Copy link
Member

cbornet commented Dec 4, 2018

Actually I think this all should be simplified to:

return requestBuilder.retrieve().bodyToMono(returnType);

which should throw a WebClientResponseException if the status code is 4xx or 5xx

@lukstei
Copy link
Contributor Author

lukstei commented Dec 6, 2018

Actually I think this all should be simplified to:

return requestBuilder.retrieve().bodyToMono(returnType);

which should throw a WebClientResponseException if the status code is 4xx or 5xx

@cbornet yes you are right it is handled when calling retrieve() instead of exchange() (see DefaultWebClient:374). So this custom error handling can be removed altogether. I will do this.

Two further questions arised:

  1. Should we wrap the WebClientResponseException in an ApiException?
  2. ApiClient:495: This return Mono.empty() is not optimal because it does not consume the body (see note in ClientResponse).
    This is fixed when using your suggested solution because it then calls the drainBody() method (see DefaultWebClient.java:448) which consumes the body.
    The question for me is, if we can safely remove this custom handling logic altogether. I think for the second case yes (returnType == null), because this is already handled in the BodyExtractor, but I'm not sure about the response.statusCode() == HttpStatus.NO_CONTENT case, what do you think?

@cbornet
Copy link
Member

cbornet commented Dec 6, 2018

IMO we should remove all the logic and not use ApiException as it doesn't add any value. Also I think WebClient users would expect WebClientResponseException if something went wrong.

@lukstei
Copy link
Contributor Author

lukstei commented Dec 9, 2018

I removed all the logic, which makes it much more cleaner now and also solves the initial issue #1243.

The question whether we should use the ApiException is for me still not clear, because I think it would never add any value regardless of the underlying library, and I suppose every library has its own underlying Exception, but this should be discussed on a more general level and not in this issue I think.

@cbornet thank you for the input.

@cbornet
Copy link
Member

cbornet commented Dec 9, 2018

LGTM 👍

@cbornet
Copy link
Member

cbornet commented Dec 9, 2018

As for ApiException it could be used to replace the RuntimeException that are thrown at some places of the code.

@wing328 wing328 merged commit c79d277 into OpenAPITools:master Feb 19, 2019
jimschubert added a commit that referenced this pull request Feb 23, 2019
* master: (40 commits)
  [Python] remove default value from being fallback to example (#2213)
  Add petstore integration tests to Ruby OAS3 client (#2211)
  Gradle - make GenerateTask properties optional (#2185)
  skip bats installation (#2198)
  Something in the dependencies changed. This switch is no longer needed. (#1850)
  Use oauth token for basic bearer auth in Rust. (#2161)
  Fix missing nullable (#2189)
  Enable error handling in Java WebClient library, fixes #1243 (#1244)
  [core] fix referenced enum case (#2175)
  rest-template: allow array parameters in path using collectionFormat (#2177)
  update go petstore samples
  Fix string types for cpprestsdk client generator (#1676)
  update kotline samples
  Remove API Key Authentication code for go when cookie is used. (#1601)
  changed the package install instructions to install the .tgz package … (#1989)
  okhttp-gson: allow array parameters in path using collectionFormat (#2137)
  [Ruby] Fix regualr expression in error message (#2069) (#2139)
  [kotlin][client] bytearray conversion (#2166)
  [rust-server] Added client documentation to rust-server (#2159)
  [Java] Getter/Setter naming convention not followed in generated models (#2095)
  ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Java] [WebClient] Custom error handling of HTTP responses not possible
3 participants