Spring Boot Webflow-Set UTF-8编码 [英] Spring Boot Webflux - Set UTF-8 Encoding

查看:18
本文介绍了Spring Boot Webflow-Set UTF-8编码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在使用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. ä, ö, ü)...");
}
由于文本数据包含一些元音(例如ä,ö,ü),我希望将响应的Content-Type标头从text/event-stream更改为text/event-stream;charset=UTF-8。因此,我尝试了包装成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请求会显示Content-Type保持不变:

< 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,以便浏览器正确解释元音字符?

编辑: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. ä, ö, ü)..."));
}

推荐答案

您可以在返回到浏览器之前创建筛选器和处理响应

    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);
        }
    
    }

这篇关于Spring Boot Webflow-Set UTF-8编码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆