我一直在使用Spring Boot 2.0.0.RC1并使用spring-boot-starter-webflux来构建一个REST控制器,该控制器返回大量的文本数据。
@GetMapping(value = "/")
public Flux<String> getData(){
return Flux.interval(Duration.ofSeconds(2))
.map(l -> "Some text with umlauts (e.g. ä, ö, ü)...");
}由于文本数据包含一些umlauts (例如,text/event-stream,ü),所以我想将响应的内容类型标题从text/event-stream;charset=UTF-8改为Content头。因此,我尝试将其封装到ResponseEntity中。如下所示:
@GetMapping(value = "/")
public ResponseEntity<Flux<String>> getData(){
return ResponseEntity
.ok()
.contentType(MediaType.parseMediaType("text/event-stream;charset=UTF-8"))
.body(Flux.interval(Duration.ofSeconds(2))
.map(l -> "Some text with umlauts (e.g. ä, ö, ü)..."));
}现在,向端点发出curl请求显示内容类型保持不变:
< HTTP/1.1 200 OK
< transfer-encoding: chunked
< Content-Type: text/event-stream
<
data:Some text with umlauts (e.g. ├ñ, ├Â, ├╝)...我怀疑MediaType.parseMediaType()方法是问题所在,但是正确地分析了媒体类型(如下面的屏幕截图所示):

但是,参数charset似乎被忽略了。如何将编码更改为UTF-8,以便浏览器正确解释umlaut字符?
编辑:在GetMapping注释中的设置-- produces字段也不工作。
@GetMapping(value = "/", produces = "text/event-stream;charset=UTF-8")
public ResponseEntity<Flux<String>> getData(){
return ResponseEntity
.accepted()
.contentType(MediaType.parseMediaType("text/event-stream;charset=UTF-8"))
.body(Flux.interval(Duration.ofSeconds(2))
.map(l -> "Some text with umlauts (e.g. ä, ö, ü)..."));
}发布于 2021-07-16 09:01:40
您可以在此返回浏览器之前创建筛选器和进程响应。
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.core.Ordered;
// esse filtro foi criado pra converter para UTF-8 o response do Flux<ServerSentEvent<String>>
// this filter was created to convert all responses to UTF8, including Flux<ServerSentEvent<String>>
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class FluxPreProcessorFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
response.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
}https://stackoverflow.com/questions/48864564
复制相似问题