Reader entry: ���� 乱码详解

  • 1.问题描述
  • 2.问题分析
  • 3.问题解决

系统:Win10
JDK:1.8.0_333
IDEA:2020.3.4

1.问题描述

在一次写 MyBatis 项目工程的时候,使用 Logback 打印日志时,发现控制台有输出乱码,乱码如下

[DEBUG]  [main] o.a.i.l.LogFactory - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
[DEBUG]  [main] o.a.i.io.VFS - Class not found: org.jboss.vfs.VFS
[DEBUG]  [main] o.a.i.i.JBoss6VFS - JBoss 6 VFS API is not available in this environment.
[DEBUG]  [main] o.a.i.io.VFS - Class not found: org.jboss.vfs.VirtualFile
[DEBUG]  [main] o.a.i.io.VFS - VFS implementation org.apache.ibatis.io.JBoss6VFS is not valid in this environment.
[DEBUG]  [main] o.a.i.io.VFS - Using VFS adapter org.apache.ibatis.io.DefaultVFS
[DEBUG]  [main] o.a.i.i.DefaultVFS - Find JAR URL: file:/C:/Programming/Workspace/IDEA/TestLogback/target/classes/com/lijinjiang/pojo
[DEBUG]  [main] o.a.i.i.DefaultVFS - Not a JAR: file:/C:/Programming/Workspace/IDEA/TestLogback/target/classes/com/lijinjiang/pojo
[DEBUG]  [main] o.a.i.i.DefaultVFS - Reader entry: User.class
[DEBUG]  [main] o.a.i.i.DefaultVFS - Listing file:/C:/Programming/Workspace/IDEA/TestLogback/target/classes/com/lijinjiang/pojo
[DEBUG]  [main] o.a.i.i.DefaultVFS - Find JAR URL: file:/C:/Programming/Workspace/IDEA/TestLogback/target/classes/com/lijinjiang/pojo/User.class
[DEBUG]  [main] o.a.i.i.DefaultVFS - Not a JAR: file:/C:/Programming/Workspace/IDEA/TestLogback/target/classes/com/lijinjiang/pojo/User.class
[DEBUG]  [main] o.a.i.i.DefaultVFS - Reader entry: ����   4 I
[DEBUG]  [main] o.a.i.i.ResolverUtil - Checking to see if class com.lijinjiang.pojo.User matches criteria [is assignable to Object]
[DEBUG]  [main] o.a.i.d.p.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
[DEBUG]  [main] o.a.i.d.p.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
[DEBUG]  [main] o.a.i.d.p.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
[DEBUG]  [main] o.a.i.d.p.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
[DEBUG]  [main] o.a.i.i.DefaultVFS - Find JAR URL: file:/C:/Programming/Workspace/IDEA/TestLogback/target/classes/com/lijinjiang/mapper
[DEBUG]  [main] o.a.i.i.DefaultVFS - Not a JAR: file:/C:/Programming/Workspace/IDEA/TestLogback/target/classes/com/lijinjiang/mapper
[DEBUG]  [main] o.a.i.i.DefaultVFS - Reader entry: UserMapper.class
[DEBUG]  [main] o.a.i.i.DefaultVFS - Reader entry: UserMapper.xml
[DEBUG]  [main] o.a.i.i.DefaultVFS - Listing file:/C:/Programming/Workspace/IDEA/TestLogback/target/classes/com/lijinjiang/mapper
[DEBUG]  [main] o.a.i.i.DefaultVFS - Find JAR URL: file:/C:/Programming/Workspace/IDEA/TestLogback/target/classes/com/lijinjiang/mapper/UserMapper.class
[DEBUG]  [main] o.a.i.i.DefaultVFS - Not a JAR: file:/C:/Programming/Workspace/IDEA/TestLogback/target/classes/com/lijinjiang/mapper/UserMapper.class
[DEBUG]  [main] o.a.i.i.DefaultVFS - Reader entry: ����   4
[DEBUG]  [main] o.a.i.i.DefaultVFS - Find JAR URL: file:/C:/Programming/Workspace/IDEA/TestLogback/target/classes/com/lijinjiang/mapper/UserMapper.xml
[DEBUG]  [main] o.a.i.i.DefaultVFS - Not a JAR: file:/C:/Programming/Workspace/IDEA/TestLogback/target/classes/com/lijinjiang/mapper/UserMapper.xml
[DEBUG]  [main] o.a.i.i.DefaultVFS - Reader entry: <?xml version="1.0" encoding="UTF-8" ?>
[DEBUG]  [main] o.a.i.i.ResolverUtil - Checking to see if class com.lijinjiang.mapper.UserMapper matches criteria [is assignable to Object]
[DEBUG]  [main] o.a.i.t.j.JdbcTransaction - Opening JDBC Connection
[DEBUG]  [main] o.a.i.d.p.PooledDataSource - Created connection 1863702030.
[DEBUG]  [main] o.a.i.t.j.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6f15d60e]
[DEBUG]  [main] c.l.m.U.selectAll - ==>  Preparing: select * from tb_user;
[DEBUG]  [main] c.l.m.U.selectAll - ==> Parameters:
[DEBUG]  [main] c.l.m.U.selectAll - <==      Total: 3
[User{id=1, username='古天乐', password='123456', gender='男', address='香港'}, User{id=2, username='刘亦菲', password='123456', gender='女', address='湖北'}, User{id=3, username='胡歌', password='123456', gender='男', address='上海'}]
[DEBUG]  [main] o.a.i.t.j.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6f15d60e]
[DEBUG]  [main] o.a.i.t.j.JdbcTransaction - Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6f15d60e]
[DEBUG]  [main] o.a.i.d.p.PooledDataSource - Returned connection 1863702030 to pool.

2.问题分析

先贴出来我的 mybatis 配置信息

    <!-- 类型别名 --><typeAliases><package name="com.lijinjiang.pojo"/></typeAliases><!-- 环境配置 --><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><!-- 映射器 --><mappers><!-- 包扫描 --><package name="com.lijinjiang.mapper"/></mappers>

在一番尝试后,我发现,这里的乱码和 mybatis 的配置信息有关,当我的 类型别名(typeAliases)和 映射器(mappers)配置成包扫描模式的时候(package),就会出现这样的乱码
所以我尝试将这两个配置恢复成单个配置项

    <!-- 类型别名 --><typeAliases><typeAlias type="com.lijinjiang.pojo.User" alias="User"/></typeAliases><!-- 环境配置 --><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><!-- 映射器 --><mappers><!-- 加载指定的 SQL 映射文件--><mapper resource="com/lijinjiang/mapper/UserMapper.xml"/></mappers>

然后就发现控制台的乱码果然就消失了

[DEBUG]  [main] o.a.i.l.LogFactory - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
[DEBUG]  [main] o.a.i.d.p.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
[DEBUG]  [main] o.a.i.d.p.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
[DEBUG]  [main] o.a.i.d.p.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
[DEBUG]  [main] o.a.i.d.p.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
[DEBUG]  [main] o.a.i.t.j.JdbcTransaction - Opening JDBC Connection
[DEBUG]  [main] o.a.i.d.p.PooledDataSource - Created connection 1626343059.
[DEBUG]  [main] o.a.i.t.j.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@60f00693]
[DEBUG]  [main] c.l.m.U.selectAll - ==>  Preparing: select * from tb_user;
[DEBUG]  [main] c.l.m.U.selectAll - ==> Parameters:
[DEBUG]  [main] c.l.m.U.selectAll - <==      Total: 3
[User{id=1, username='古天乐', password='123456', gender='男', address='香港'}, User{id=2, username='刘亦菲', password='123456', gender='女', address='湖北'}, User{id=3, username='胡歌', password='123456', gender='男', address='上海'}]
[DEBUG]  [main] o.a.i.t.j.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@60f00693]
[DEBUG]  [main] o.a.i.t.j.JdbcTransaction - Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@60f00693]
[DEBUG]  [main] o.a.i.d.p.PooledDataSource - Returned connection 1626343059 to pool.

但是这种方法治标不治本,以后做大工程的时候,不可能一项一项配置别名和映射文件,所以我们得找出具体的原因,然后从根本上解决这个问题
这时候,我们回到打印乱码的位置,看下能不能获得啥有用的信息

[DEBUG]  [main] o.a.i.i.DefaultVFS - Reader entry: ����   4 I

这里我们可以看到是 DefaultVFS 类输出的这条信息,那么 DefaultVFS 是什么呢?

VFS 全称是 Virtual File System,他是一个虚拟的文件系统,为读取不同存储介质中的文件和数据提供一个统一的API方法
在 mybatis 中,VFS 定义了访问程序宿主机资源的 API 接口,这些资源包括:jar 包,class 文件,配置文件等
mybatis 内置了两种 VFS 实现:JBoss6VFSDefaultVFS

public static final Class<?>[] IMPLEMENTATIONS = { JBoss6VFS.class, DefaultVFS.class };

其中 JBoss6VFS 的实现依赖于 JBoss 6 的 VFS API,DefaultVFS 则是适用于大多数应用程序服务器的 VFS 的默认实现
这里打印乱码的就是 DefaultVFS ,我们就打开 DefaultVFS 文件,看看是哪里打印的这条信息
DefaultVFS 类的包路径为:org.apache.ibatis.io
我们通过打断点的方式进行调试,发现具体代码位置如下图所示

这里解释一下为什么这里会打印乱码现象
这里的 list 方法是用于递归获取指定路径下的所有资源列表
首先会把我们配置的包路径:com.lijinjiang.pojo 传递过来,找到了里面的 User.class,资源合法,放进 resources,然后下面会递归调用 list 方法,进入 User.class 内,这时候使用 readLine 方法读取一行数据就产生了乱码,还打印进了 debug 日志

3.问题解决

这里出现乱码的原因是 DefaultVFS 导致的,那么我们换成 JBoss6VFS 试下,不过它的实现依赖于 JBoss 6 的 VFS API,所以我们需要先在 pom 里配置 jboss-vfs 的依赖

<!-- 添加 jboss-vfs 依赖 -->
<dependency><groupId>org.jboss</groupId><artifactId>jboss-vfs</artifactId><version>3.2.17.Final</version>
</dependency>

我们再运行一下程序就可以发现,乱码的日志不见了

[DEBUG]  [main] o.a.i.l.LogFactory - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
[DEBUG]  [main] o.a.i.io.VFS - Using VFS adapter org.apache.ibatis.io.JBoss6VFS
[DEBUG]  [main] o.a.i.i.ResolverUtil - Checking to see if class com.lijinjiang.pojo.User matches criteria [is assignable to Object]
[DEBUG]  [main] o.a.i.d.p.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
[DEBUG]  [main] o.a.i.d.p.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
[DEBUG]  [main] o.a.i.d.p.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
[DEBUG]  [main] o.a.i.d.p.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
[DEBUG]  [main] o.a.i.i.ResolverUtil - Checking to see if class com.lijinjiang.mapper.UserMapper matches criteria [is assignable to Object]
[DEBUG]  [main] o.a.i.t.j.JdbcTransaction - Opening JDBC Connection
[DEBUG]  [main] o.a.i.d.p.PooledDataSource - Created connection 258535644.
[DEBUG]  [main] o.a.i.t.j.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@f68f0dc]
[DEBUG]  [main] c.l.m.U.selectAll - ==>  Preparing: select * from tb_user;
[DEBUG]  [main] c.l.m.U.selectAll - ==> Parameters:
[DEBUG]  [main] c.l.m.U.selectAll - <==      Total: 3
[User{id=1, username='古天乐', password='123456', gender='男', address='香港'}, User{id=2, username='刘亦菲', password='123456', gender='女', address='湖北'}, User{id=3, username='胡歌', password='123456', gender='男', address='上海'}]
[DEBUG]  [main] o.a.i.t.j.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@f68f0dc]
[DEBUG]  [main] o.a.i.t.j.JdbcTransaction - Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@f68f0dc]
[DEBUG]  [main] o.a.i.d.p.PooledDataSource - Returned connection 258535644 to pool.

那么为什么换成 JBoss6VFS 就不打印乱码了呢?它代码里都不调用打印日志功能,我不打印总不会出错吧

所以,只要配置 jboss-vfs 的依赖即可

Reader entry: ���� 乱码详解相关推荐

  1. android java 中文乱码_android读写中文如何避免乱码详解

    前言 android读取文件中文出现乱码的原因无非就是,读取文件的字符格式与写如文件的格式不一致.因此,避免中文乱码,要在写入文件的时候按照一定的格式写入,读取的时候按照一定的格式读取.这样对应就不会 ...

  2. java乱码详解(java中byte与char的转换)

    转自:http://hi.baidu.com/%C6%F3%D2%B5%BC%D2%D4%B0/blog/item/825a4858d6248e8b810a181a.html   java byte与 ...

  3. python读取中文文件乱码-详解Python的json文件读取及中文乱码显示问题解决方法...

    Python的json文件读取及解决中文乱码显示问题 本文实例讲述了Python实现的json文件读取及中文乱码显示问题解决方法.分享给大家供大家参考,具体如下: city.json文件的内容如下: ...

  4. RSA加密解密,分段加密,分段解密,部分汉字乱码详解

    在日常的业务逻辑中,难免会遇到需要加密的时候,而常见的MD5加密因为是单向加密并且不可逆,导致应用场景非常的少,而这个时候,RSA对称加密就诞生了. RSA加密的逻辑是,生成一个公钥和私钥. 你可以选 ...

  5. ext核心API详解

    http://hi.baidu.com/j2me/profile 1 EXT核心API详解(一)-Ext 1 EXT核心API详解(二)-Array/Date/Function/Number/Stri ...

  6. Reader entry: ���� 乱码

    mybatis3.3.*中DefaultVFS的logger乱码问题 博客分类: java mybatisResolverUtilDefaultVFS乱码  mybatis3.3.0和mybatis3 ...

  7. Reader entry: �����乱码问题

    Mybatis中Reader entry: �����乱码问题 原因:这是由于Mybatis中加入了 "别名"!!! <!--别名--><typeAliases& ...

  8. mybatis日志中 Reader entry:���� 3    findStudentById 出现乱码的解决

    当我们使用mybatis时, 其日志的打印信息中, 有时会出现乱码. Class not found: org.jboss.vfs.VFS JBoss 6 VFS API is not availab ...

  9. mybatis 日志 Reader entry 乱码

    mybatis 日志 Reader entry 乱码 问题 现象:乱码日志如下 2021-03-04 10:59:13 -0 [main] DEBUG - Logging initialized us ...

最新文章

  1. Java 巨坑篇之无底深坑Long类型
  2. LeetCode Longest Repeating Character Replacement(滑动窗口)
  3. Worm HDU 2151
  4. 某些equipment无法顺利download到CRM的原因
  5. Maven 仓库使用与私有仓库搭建
  6. IOS开发--网络篇--GET请求和POST请求
  7. 红米AirDots无线蓝牙耳机成功连接WIN7电脑
  8. win10窗口设置眼睛保护色
  9. AE-after Effects 笔记
  10. 快速注册认证小程序,三分钟学会免300元认证企业小程序
  11. python如何设置清华镜像源
  12. css cubic-bezier,使用cubic-bezier()创建带有反弹特效的CSS动画
  13. iPhone升级iOS 16后Siri无法正常工作怎么办?3种解决办法
  14. cesium 根据SampledPositionProperty与timeline实现轨迹回放功能(跟随视角、上帝视角) 详细代码与理解记录
  15. java嵌套for循环基础练习 -班级平均分
  16. 安卓查壳与反编译相关知识集锦
  17. 计算机专业笔记本用i5还是i7,玩游戏笔记本i5和i7的区别_笔记本电脑游戏用i5还是i7...
  18. 快醒醒吧!你连基础的JVM运行时内存布局都忘了?Java面试题及解析
  19. 就业技术书文件表格_《就业规划书》模板
  20. Centos修改IP

热门文章

  1. FullCalendar日历插件说明文档
  2. Stratifyd:了解数据串联五步骤,解锁数据孤岛难题
  3. python 70行完成requests抓取csdn阅读量.
  4. CSDN视频网站观后感
  5. 龙世界java游戏_我的世界:当Notch在6年后重回mc,会发生什么?萌新的像个弟弟...
  6. 多重背包问题的二进制优化(C语言)
  7. 第四次 Erlang 开发者大会(CN Erlounge IV)正式开通注册通道
  8. 国网GIM设备三维模型要求细则 - 交流断路器
  9. sql语句 DATE_FORMAT的使用
  10. 科技“扶智”走进四川阿坝,“书路计划”让藏区孩子爱上阅读