Reader entry: ���� 乱码详解_reader entry:乱码-程序员宅基地

技术标签: Java  MyBatis  Mybatis  

Reader entry: ���� 乱码详解

系统: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 的依赖即可

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_35132089/article/details/126319512

智能推荐

JAVA开发Web Service几种框架介绍-程序员宅基地

文章浏览阅读68次。郑重声明:此文为转载来的,出处已不知了,侵告删。  在讲Web Service开发服务时,需要介绍一个目前开发Web Service的几个框架,分别为Axis,axis2,Xfire,CXF以及JWS(也就是前面所述的JAX-WS,这是Java6发布所提供的对 Web Service服务的一种实现。)前面几项都为开源项目,而其中又以axis2与cxf所最为常用,Axis与XFir..._java开发使用的几种server的名称

C/C++:编译全过程——预处理、编译、汇编、链接(包含预处理指令:宏定义,文件包括、条件编译)_怎么在devc++里面把c文件变成汇编语言-程序员宅基地

文章浏览阅读1.4k次。一、前言 C/C++的编译过程包含了四个步骤: 1. 预处理(Preprocessing) 2. 编译(Compilation) 3. 汇编(Assemble) 4..链接(Linking)二、预处理 预处理阶段主要处理一些预处理指令,比如文件包括、宏定义、条件编译。1.文件包括 文件包括就是将所有的#include..._怎么在devc++里面把c文件变成汇编语言

Pytorch深度学习实践第十二讲 RNN 课后1(LSTM)_pytorch深度学习实践12课后作业-程序员宅基地

文章浏览阅读837次,点赞3次,收藏9次。B站 刘二大人 传送门 循环神经网络(基础篇)课件链接:https://pan.baidu.com/s/1vZ27gKp8Pl-qICn_p2PaSw提取码:cxe4模型还是将输入“hello”训练输出为“ohlol”,用LSTM网络实现。按照计算图实现LSTM之后,又尝试了加入embedding的方法。加embedding的训练快,但是我的LSTM效果不如前面RNN的,不知道是我网络写的有问题还是怎么回事。LSTM的网络结构示意图和公式:根据我自己的理解写出来的LSTM模型,有不对的地方_pytorch深度学习实践12课后作业

android实训项目无线点餐系统服务器的设置,无线点餐系统的设计与实现--Android实训.doc...-程序员宅基地

文章浏览阅读208次。Android课程设计报告院 系: 计算机与信息工程学院班 级: 10级软件技术一班学 号:姓 名:PAGEPAGE 14目录TOC \o "1-3" \h \u 24017 一、系统架构 311293 二、功能分配 35248 2.1.浏览功能 326351 2.2.查询功能 314154 2.3.插入功能 328656 2.4.修改功能 41740 2.5.删除功能 41540 三、内..._android无线点餐系统

Python3 --- Scrapy安装_command "e:\python3.7.3\python.exe -u -c "import s-程序员宅基地

文章浏览阅读566次。安装方式一:如果使用的是PyCharm则File--&gt;Settings--&gt;Project Interpreter,选择绿色加号搜索Scrapy安装即可,如下图:这里需要注意Manage Repositories可以配置成: https://pypi.douban.com/simple/ http://mirrors.aliyun.com/pypi/simple/..._command "e:\python3.7.3\python.exe -u -c "import setuptools, tokenize;__file

cookie和session的区别(简单理解)_cookie和session区别-程序员宅基地

文章浏览阅读471次。由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session.典型的场景比如购物车,当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的Session,用用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。这个Session是保存在服务端的,有一个唯一标识。在服务端保..._cookie和session区别

随便推点

OwlCarousel使用-程序员宅基地

文章浏览阅读1.4w次,点赞6次,收藏19次。参考:http://www.jq22.com/jquery-info6010使用方法Owl Carousel 2是上一版Owl Carousel的升级版本。Owl Carousel 2可以让你创建漂亮的响应式旋转木马的jQuery插件,它支持移动触摸屏,功能十分强大。Owl的新特性有: 可以无限循环 项目可以居中显示 灵活的速度控制 多级别的paddin..._owlcarousel

【深度学习】使用caffeNet训练自己的数据集(caffe框架)-程序员宅基地

文章浏览阅读3.5k次。主要参考:官方网址:http://caffe.berkeleyvision.org/gathered/examples/imagenet.html数据集及第一部分参考网址:http://www.lxway.com/4010652262.htm主要步骤:1. 准备数据集2. 标记数据集3. 创建lmdb格式的数据4. 计算均值5. 设置网络及求解器6. 运行求解由于imagenet的数据集太大,博主..._caffenet

SpringBoot集成Quartz 2.3.1动态管理定时任务_springboot实现动态管理quartz-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏12次。我写了一个简单的Demo项目,有需要的文末可获取项目github地址,该项目我会一直保持更新。基于quartz2.3.1实现动态管理定时任务。使用swagger实现接口文档。前后端统一使用JSON格式交互。使用Hutool工具类直接连接数据库,避免Job任务中不能使用Autowired问题。swagger文档如下图:后续文章创建JobDetail(JobBuilder详解)创建CronTrigger(TriggerBuilder详解)_springboot实现动态管理quartz

C#控制利用模板文件通过BarTender控制斑马打印机打印_c# 直接调用斑马打印机打印固定模板-程序员宅基地

文章浏览阅读2k次。重点在后面:https://blog.csdn.net/z_344791576/article/details/46328443?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159546478119725219951536%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=15954647811972521995_c# 直接调用斑马打印机打印固定模板

matlab multiple animatedline,matlab画图详解-程序员宅基地

文章浏览阅读926次。一. 二维图形(Two dimensional plotting)1. 基本绘图函数(Basic plotting function):Plot,semilogx,semilogy, loglog,polar, plotyy(1). 单矢量绘图(single vectorplotting):plot(y),矢量y的元素与y元素下标之间在线性坐标下的关系曲线。例1:单矢量绘图y=[0 0.6 2...._animatedline 添加图例