Search code examples
springcontrollerspring-webflux

Return mono object with response entity webflux


I have the below controller

@RestController
@RequestMapping("/view")
public class ViewController {
@GetMapping(value = "/{channelId}/**")
public Mono<ResponseEntity<ViewResponse>> viewObject(@PathVariable(value = "channelId") String channelId) {

return redisController.getChannelData(channelInfoset, channelId).map(response -> {
     Mono<ViewResponse> processOutput = processViewUrl(channelId); // returns object of Mono.just
    return new ResponseEntity<>(processOutput, responseHeaders, HttpStatus.OK);
}}

The method which returns the mono object

private Mono<ViewResponse> processViewUrl(String channelId){
    return Mono.just(new ViewResponse("val","temp",false));
}

This gives me an error saying

Incompatible types. Found: 'reactor.core.publisher.Mono<java.lang.Object>', required: 'reactor.core.publisher.Mono<org.springframework.http.ResponseEntity<com.api.model.ViewResponse>>'

What is wrong over here?


Solution

  • processOutput is a Mono<ViewResponse>, not a ViewResponse. To obtain a Mono<ResponseEntity<ViewResponse>>, you should map processOutput to a ResponseEntity:

    return redisController.getChannelData(channelInfoset, channelId)
                          .map(response -> {
                              Mono<ViewResponse> processOutput = processViewUrl(channelId);
                             return processOutput.map(value -> new ResponseEntity(value, response.getHeaders(), HttpStatus.OK));
    }}
    

    Note that if there's no constraint over your processViewUrl method signature (API compliance, potential other async/complex implementation, etc.), I would recommend to change it to return directly a ViewResponse instead of a mono. Mono.just is not necessary here.

    In general cases, Mono.just is required only when you want to provide a value to an operation that requires a publisher as input. If you return directly a ViewResponse instead of a Mono<ViewResponse>, your initial code should work.