Skip to content

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

Merged
wing328 merged 2 commits into
OpenAPITools:masterfrom
lukstei:issue/1237
Feb 19, 2019
Merged

Enable error handling in Java WebClient library, fixes #1243#1244
wing328 merged 2 commits into
OpenAPITools:masterfrom
lukstei:issue/1237

Conversation

@lukstei

Copy link
Copy Markdown
Contributor

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.:

publicclassMyApiClientextendsApiClient {
@Overrideprotected <T> Mono<T> handleUnsuccessfulResponse(ClientResponseresponse) {
returnsuper.<T>handleUnsuccessfulResponse(response)
.onErrorMap(errorcode(404), x -> newMyNotFoundException("Not found"));
}
privatestaticPredicate<Throwable> errorcode(interrorCode) {
returnx -> xinstanceofApiException && ((ApiException) x).getCode() == errorCode;
}
}

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

@wing328

Copy link
Copy Markdown
Member

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
Copy Markdown
Member

cc @daonomic who's added the WebClient support.

@lukstei

Copy link
Copy Markdown
ContributorAuthor

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

@wing328wing328 modified the milestones: 3.3.2, 3.3.3Oct 31, 2018
@cbornet

cbornet commented Oct 31, 2018

Copy link
Copy Markdown
Member

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

@wing328wing328 modified the milestones: 3.3.3, 3.3.4Nov 14, 2018
@wing328wing328 modified the milestones: 3.3.4, 4.0.0Nov 30, 2018
@cbornet

cbornet commented Dec 4, 2018

Copy link
Copy Markdown
Member

Actually I think this all should be simplified to:

returnrequestBuilder.retrieve().bodyToMono(returnType);

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

@lukstei

Copy link
Copy Markdown
ContributorAuthor

Actually I think this all should be simplified to:

returnrequestBuilder.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
Copy Markdown
Member

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
Copy Markdown
ContributorAuthor

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

cbornet commented Dec 9, 2018

Copy link
Copy Markdown
Member

LGTM 👍

@cbornet

Copy link
Copy Markdown
Member

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:masterFeb 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 freeto 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

@lukstei@wing328@cbornet