You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 13:05:21