7.spring boot activiti 審批留言亂碼問題

最近用spring boot整合activiti后,發(fā)現(xiàn)審批留言有亂碼,很是困惑.經(jīng)過研究發(fā)現(xiàn),是編碼的問題.

先看Comment源碼:

  public byte[] getFullMessageBytes() {
    return (fullMessage!=null ? fullMessage.getBytes() : null);
  }

  public void setFullMessageBytes(byte[] fullMessageBytes) {
    fullMessage = (fullMessageBytes!=null ? new String(fullMessageBytes) : null );
  }

數(shù)據(jù)庫中這個(gè)字段是個(gè)blob字段.set get時(shí)用的是默認(rèn)編碼.這個(gè)默認(rèn)編碼是什么,用下面一段代碼,隨便加在一個(gè)controller中就可以得出.

String name1 = Charset.defaultCharset().name();
System.out.println(name1);
String name2 =Charset.defaultCharset().name(); 
System.out.println(name2);

啟動(dòng)單獨(dú)的tomcat,經(jīng)過測(cè)試,發(fā)現(xiàn)是GBK.
然后用idea啟動(dòng)tomcat,發(fā)現(xiàn)是UTF-8.為什么,因?yàn)槲倚薷腏etBrains\IntelliJ IDEA 2017.1\bin\idea64.exe.vmoptions文件,增加一行,修改了jvm啟動(dòng)參數(shù)

-Dfile.encoding=UTF-8

tomcat的jvm啟動(dòng)參數(shù)設(shè)置為utf-8
D:\devinstall\apache-tomcat-8.5.9\bin\catalina.bat
增加一行

set JAVA_OPTS=-Dfile.encoding=UTF-8

或者環(huán)境變量里設(shè)置

JAVA_TOOL_OPTIONS
-Dfile.encoding=UTF-8

這樣tomcat啟動(dòng)后,編碼就變成里utf-8.
我是有一次修改了這個(gè)tomcat編碼utf-8后,用戶發(fā)起了審批留言.然后我又換回了gbk.用戶發(fā)起審批留言的時(shí)候存入數(shù)據(jù)庫是utf-8編碼,切回gbk環(huán)境,讀取utf-8編碼的數(shù)據(jù)就有問題了.

我決定tomcat用utf-8編碼,blob字段也轉(zhuǎn)為utf-8編碼.先進(jìn)數(shù)據(jù)庫把數(shù)據(jù)導(dǎo)出到excel,就2列,id和blob字段.放到d盤,另存為-工具-web選項(xiàng),選擇編碼:utf-8,默認(rèn)是gbk.

Paste_Image.png
Paste_Image.png

轉(zhuǎn)換代碼:

    @Test
    public void test11() throws Exception {
        //1.通過excel獲取sheet.
        Sheet sheet = getSheetByFile();
        //2.通過sheet獲取MyComment
        List<MyComment> list = getList(sheet);
        System.out.println(list);
        //3.通過循環(huán)list,更新值
        for (MyComment c:list){
            String message = c.getMessage();
            String id=c.getId();
            byte[] bytes = message.getBytes("UTF-8");
            todoTaskDao.updateComment(bytes, id);
        }

    }

    public static Sheet getSheetByFile() throws Exception {
        InputStream stream= new FileInputStream(new File("d:\\5.xls"));
        Workbook wb = new HSSFWorkbook(stream);
        return wb.getSheetAt(0);
    }

    public List<MyComment> getList(Sheet sheet1) throws Exception {
        List<MyComment> myComments = new ArrayList<>();
        for (int i = 1; i <= sheet1.getLastRowNum(); i++) {
            try {
                HSSFRow row = (HSSFRow) sheet1.getRow(i);
                HSSFCell cell;
                if (row == null || MyUtils.isBlankRow(row)) {
                    continue;
                }
                MyComment myComment = new MyComment();
                for (int j = 0; j <= row.getLastCellNum(); j++) {
                    cell = row.getCell(j);
                    if (cell == null)
                        continue;
                    switch (j) {
                        case 0:
                            cell.setCellType(CellType.STRING);
                            myComment.setId(cell.getStringCellValue());
                            break;
                        case 1:
                            cell.setCellType(CellType.STRING);
                            myComment.setMessage(cell.getStringCellValue());
                            break;
                        default:
                            break;
                    }
                }
                myComments.add(myComment);
            } catch (Exception e) {
                String message = "第" + (i + 1) + "行有錯(cuò)誤:" + e.getMessage();
                throw new Exception(message);
            }
        }
        return myComments;
    }
package com.yunchuang.console.workflow.domain;

import java.util.Arrays;

/**
 * @author 尹冬飛
 * @create 2017-04-20 13:40
 */
public class MyComment {
    protected String id;
    protected String message;
    protected Object fullMessage;
    protected byte[] fullMessageBytes;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Object getFullMessage() {
        return fullMessage;
    }

    public void setFullMessage(Object fullMessage) {
        this.fullMessage = fullMessage;
    }

    public byte[] getFullMessageBytes() {
        return fullMessageBytes;
    }

    public void setFullMessageBytes(byte[] fullMessageBytes) {
        this.fullMessageBytes = fullMessageBytes;
    }

    @Override
    public String toString() {
        return "MyComment{" +
                "id='" + id + '\'' +
                ", message='" + message + '\'' +
                ", fullMessage=" + fullMessage +
                ", fullMessageBytes=" + Arrays.toString(fullMessageBytes) +
                '}';
    }
}

    <resultMap id="commentResultMap" type="com.yunchuang.console.workflow.domain.MyComment">
        <id property="id" column="ID_" jdbcType="VARCHAR" />
        <result property="fullMessage" column="FULL_MSG_" jdbcType="BLOB" />
    </resultMap>

    <!-- COMMENT SELECT -->

    <select id="selectComment" resultMap="commentResultMap">
        select id_,FULL_MSG_
        from ACT_HI_COMMENT
        where ID_ = #{id,jdbcType=VARCHAR}
    </select>

    <!--2.更改-->
    <update id="updateComment">
        update ACT_HI_COMMENT set FULL_MSG_=#{fullMessage,jdbcType=BLOB} where  ID_ = #{id,jdbcType=VARCHAR}
    </update>

這樣就改過來了.這里提一句,測(cè)試?yán)锞幋a環(huán)境是utf-8,更改為gbk的方法為:測(cè)試的配置里更改.


Paste_Image.png

這樣啟動(dòng)tomcat,測(cè)試,發(fā)現(xiàn)都正常.
但是問題又來了,tomcat的日志顯示不正常了,都亂碼了,包括tomcat本身和logback的都亂碼.logback亂碼解決方案:
在logback-spring.xml配置文件里有這么一段

<!--寫入日志到控制臺(tái)的appender,用默認(rèn)的,但是要去掉charset,否則windows下tomcat下亂碼-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

這里沒有設(shè)置編碼,是為了解決日志亂碼

tomcat本身亂碼,經(jīng)過查找,是因?yàn)閠omcat的編碼是utf-8,但是tomcat的默認(rèn)代碼頁是gbk,在tomcat左上角右鍵屬性里可以看到.修改tomcat控制當(dāng)前活動(dòng)頁為UTF-8 .

運(yùn)行regedit打開注冊(cè)表
HKEY_CURRENT_USER\Console\Tomcat
新增DWORD(32位)值
名稱:
CodePage
數(shù)據(jù):
0000fde9

運(yùn)行tomcat,發(fā)現(xiàn)還是亂碼,因?yàn)樽煮w不支持,所以設(shè)置tomcat屬性里字體,改為非點(diǎn)陣字體.發(fā)現(xiàn)tomcat本身日志不亂碼了.

但是logback的日志在原有不亂碼的下面幾行出現(xiàn)了亂碼.我懷疑是字體問題,按照網(wǎng)上的方法試了幾次,注冊(cè)表里增加控制臺(tái)字體,都沒有效果,最后只能改為gbk編碼了.

綜上,最后處理結(jié)果是,幾碼合一,才能不亂碼:

  • tomcat控制臺(tái)代碼頁有編碼(GBK)
  • tomcat控制臺(tái)字體也支持這個(gè)編碼
  • tomcat的jvm啟動(dòng)參數(shù)有編碼(GBK,去掉UTF-8的設(shè)置)
  • logback輸入到控制臺(tái)有編碼(GBK,不設(shè)置,就是調(diào)用系統(tǒng)默認(rèn)編碼)
  • activiti設(shè)置和獲取Comment時(shí)用的系統(tǒng)默認(rèn)編碼(GBK)
  • idea啟動(dòng)時(shí)可以設(shè)置jvm啟動(dòng)編碼(可設(shè)置UTF-8)
  • 單元測(cè)試時(shí),可設(shè)置jvm編碼(根據(jù)需要隨時(shí)調(diào)整)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末莽鸭,一起剝皮案震驚了整個(gè)濱河市追驴,隨后出現(xiàn)的幾起案子然遏,更是在濱河造成了極大的恐慌弧岳,老刑警劉巖褐缠,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異土匀,居然都是意外死亡辐脖,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門僵娃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來概作,“玉大人,你說我怎么就攤上這事悯许∑袜拢” “怎么了辉阶?”我有些...
    開封第一講書人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵先壕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我谆甜,道長(zhǎng)垃僚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任规辱,我火速辦了婚禮谆棺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘罕袋。我一直安慰自己改淑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開白布浴讯。 她就那樣靜靜地躺著朵夏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪榆纽。 梳的紋絲不亂的頭發(fā)上仰猖,一...
    開封第一講書人閱讀 49,850評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音奈籽,去河邊找鬼饥侵。 笑死,一個(gè)胖子當(dāng)著我的面吹牛衣屏,可吹牛的內(nèi)容都是我干的躏升。 我是一名探鬼主播,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼狼忱,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼膨疏!你這毒婦竟也來了盗温?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤成肘,失蹤者是張志新(化名)和其女友劉穎卖局,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體双霍,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砚偶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了洒闸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片染坯。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖丘逸,靈堂內(nèi)的尸體忽然破棺而出单鹿,到底是詐尸還是另有隱情,我是刑警寧澤深纲,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布仲锄,位于F島的核電站,受9級(jí)特大地震影響湃鹊,放射性物質(zhì)發(fā)生泄漏儒喊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一币呵、第九天 我趴在偏房一處隱蔽的房頂上張望怀愧。 院中可真熱鬧,春花似錦余赢、人聲如沸芯义。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扛拨。三九已至,卻和暖如春蛤奢,著一層夾襖步出監(jiān)牢的瞬間鬼癣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來泰國打工啤贩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留待秃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓痹屹,卻偏偏與公主長(zhǎng)得像章郁,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理暖庄,服務(wù)發(fā)現(xiàn)聊替,斷路器,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,773評(píng)論 6 342
  • 編碼問題一直困擾著開發(fā)人員培廓,尤其在 Java 中更加明顯惹悄,因?yàn)?Java 是跨平臺(tái)語言,不同平臺(tái)之間編碼之間的切換...
    x360閱讀 2,470評(píng)論 1 20
  • 可以看我的博客 lmwen.top 或者訂閱我的公眾號(hào) 簡(jiǎn)介有稍微接觸python的人就會(huì)知道肩钠,python中...
    ayuLiao閱讀 3,097評(píng)論 1 5
  • 成功人與普通人价匠,最大的區(qū)別就是出現(xiàn)問題当纱,你是從自身找原因,還是從外界找原因踩窖? 今天早上在公司坡氯,因?yàn)楣ぷ魃系哪骋患?..
    再見十月閱讀 337評(píng)論 0 0