Details
-
Bug
-
Status: Closed
-
Critical
-
Resolution: Fixed
-
3.4.0
-
None
-
Unknown
-
Important
Description
It looks like we have similar/continuing issues as originally outlined in CXF-8022.
Two issues I have are:
- Flux "error" returns a mixed response
- Mono that returns empty seems to hang on thread and never return.
These are super important for us because it makes handling exceptions somewhat difficult (if there is a workaround that would be acceptable too as this is only with errors) and empty mono results, which can happen, unhandleable. We have a lot invested in using CXF as we start to move to Kamel and eventually Quarkus later and would not want to use Spring controllers.
Problem 1: Flux error returns mixed response
Using this test, when an exception is thrown from within a step in the stream the expectation is to get the error response only (handled by an ExceptionMapper). Most cases this is true.
This appears to happen only with a Flux and if the error is thrown before the last step in the chain (i.e. call a --> call b --> call c). If there are multiple steps it appears the last one will return an error correctly, in the example call a and call b would return the mixed response where as call c returns the error correctly.
Using this code (replica code in the original issue CXF-8022):
@GET @Path("/test3") @Produces(APPLICATION_JSON) @Consumes(APPLICATION_JSON) public Flux<String> getError() { return Flux .range(1, 5) .flatMap(item -> { if (item <= 4) { return Mono.just("item: " + item); } else { System.out.println("---Hitting exception"); return error(new NotFoundException()); } }) .onErrorMap(e -> new RuntimeException(e)); }
Returns this result (error):
[item: 1,item: 2,item: 3,item: 4 ]{ "status": 404, "phrase": "Not Found", "message": "javax.ws.rs.NotFoundException: HTTP 404 Not Found", "path": "/projects/xxx/test3", "timestamp": 1601172421939, "trace": [ "at aaa.bbb.project.services.ProjectResource.lambda$getError$0(ProjectResource.java:133)" ] }
Problem 2: Mono hangs returning empty
Also, as a side node, I seem to have a similar problem with an empty Mono (whereas the ticket above the problem was in the Flux)
@GET @Path("/test1a") @Produces(APPLICATION_JSON) @Consumes(APPLICATION_JSON) public Mono<Map> getMono() { return Mono.empty(); }
This will hang and not return a result. Pausing it while debugging shows it holding up on a Thread parking...