We have supported a preset "Content-Type" for regular responses for a long time with #20720, but we do not do the same for streaming and reactive type return values.
For example with this:
@PostMapping(path = "/test")
public ResponseEntity<Publisher<?>> either(@RequestBody TypeInput input) {
if ("text".equalsIgnoreCase(input.getType())) {
return ResponseEntity.ok()
.contentType(MediaType.TEXT_EVENT_STREAM)
.body(Flux.interval(Duration.ofSeconds(1))
.map(i -> "Stream response - " + LocalTime.now() + " (ID: " + i + ")"));
}
return ResponseEntity.ok()
.contentType(MediaType.APPLICATION_JSON)
.body(Mono.just(new Thing("This is a JSON response")));
}
A request with a general Accept header */*
doesn't work for the Flux
case since we can't determine the streaming format to determine.
For 7.0 we can take the preset Content-Type as-is, i.e. bypassing content negotiation.
For 6.2, we could do a bit less, taking the preset Content-Type if content negotiation doesn't produce anything specific in to avoid potential surprises from side effects where the Content-Type might be preset (in error), but is currently ignored.