Scala Play+JDBC执行含Emoji的Druid SQL时遇HTTP/502错误求助
解决Scala Play + Druid JDBC预编译语句含Emoji时的HTTP 502错误
核心问题是多字节Emoji字符的UTF-8编码长度被错误计算,导致请求的Content-Length头与实际发送的字节数不匹配,触发Jetty的BadMessageException。以下是具体解决思路:
强制JDBC连接使用UTF-8编码
在Druid Avatica的JDBC URL中显式指定字符编码参数,确保预编译语句处理Emoji时用正确的UTF-8字节数计算长度:val druidJdbcUrl = "jdbc:avatica:remote:url=http://your-druid-server:8888/druid/v2/sql/avatica/;characterEncoding=UTF-8"同时通过连接属性强化编码配置:
val connProps = new Properties() connProps.setProperty("useUnicode", "true") connProps.setProperty("characterEncoding", "UTF-8") val conn = DriverManager.getConnection(druidJdbcUrl, connProps)升级Avatica-core到与Druid 25匹配的版本
当前使用的avatica-core 1.17.0版本较旧,存在多字节字符Content-Length计算的已知bug。Druid 25对应的Avatica推荐版本为1.22.0(或更高兼容版本),升级依赖(以SBT为例):libraryDependencies += "org.apache.calcite.avatica" % "avatica-core" % "1.22.0"临时绕过方案:手动确保字符串编码一致性
若暂时无法升级依赖,可在绑定预编译参数前,强制将含Emoji的字符串按UTF-8编码转换,避免编码歧义:import java.nio.charset.StandardCharsets val emojiStr = "🥰" val utf8EncodedStr = new String(emojiStr.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8) pstmt.setString(1, utf8EncodedStr)检查Druid服务端的字符编码配置
确认Druid的Jetty服务端启用UTF-8编码,在runtime.properties中添加:druid.server.http.charset=UTF-8确保服务端正确解析UTF-8编码的请求体,避免因编码不匹配导致长度校验失败。
验证Play Framework的HTTP客户端配置
若Avatica复用了Play的HTTP客户端,可在application.conf中强制设置默认字符集:play.http.parser.defaultCharset = "utf-8"
内容的提问来源于stack exchange,提问作者Jithin K J
相关产品推荐
相关产品推荐

