This is because in WebFlux the CharSequenceEncoder is ordered once ahead for "text/plain" only and then once again at the very end for \*/\* allowing others in between to get involved, e.g. Flux<String> + "text/event-stream".
On the decoding side Jackson2JsonDecoder already explicitly ignores String. I think we need the same on the encoding side. There is little value in writing String as JSON even if content type is "application/json" but rather let it pass and be handled by the CharSequenceEncoder.
This is also consistent with Spring MVC which will write a String with the StringHttpMessageConverter for any media type.