本文针对的是Mondrian3.5.0版本出现的中文乱码问题做些修改,使用的是官方mondrian-3.5.0.zip
官方下载地址:http://sourceforge.net/projects/mondrian/files/mondrian/mondrian-3.5.0/ 。
解压mondrian.war到Tomcat运行的时候查询结果会出现乱码,可在项目的web.xml文件中添加编码方式。
修改如下:
<servlet>
<servlet-name>MondrianXmlaServlet</servlet-name>
<servlet-class>mondrian.xmla.impl.DynamicDatasourceXmlaServlet</servlet-class>
<init-param>
<param-name>CharacterEncoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
在 MondrianXmlaServlet 添加了编码过滤之后,能解决部分因中文引起的乱码问题,不过因为业务需要,需要对Mondrian的源码做些修改,所以需要在本地搭建了Mondrian3.5.0源码开发环境(这里不再讨论源码环境的搭建),排除编译错误后打包Mondrian.jar包放到项目,开启log4j日志为Debug时,会看到当加载schema文件中有中文的时候,会出现中文乱码问题。并且查询结果集也会出现乱码问题。
源码分析如下:
Mondrian在加载Schema配置文件的时候由RolapSchema类完成,借助了commons-vfs.jar包,可以加载本地文件或FTP服务器上的文件作为配置文件。
RolapSchema加载配置文件的入口方法为load(String,String),其中工具类Util.readVirtualFile()和Util.readVirtualFileAsString()实现了文件的读取,并分别返回InputStream文件输入流对象和文件文本String对象。
如果配置文件Schema xml有中文字符的话,Util.readVirtualFile()和Util.readVirtualFileAsString()方法打印出的文件内容都会出现乱码,在这里需要改造两个地方。
改造如下:
1、修改 Util.readVirtualFileAsString()方法:
a、return new String(chars) 改为 return new String(bytes,"utf-8")。
2、修改 mondrian.rolap.RolapSchema.load(String,String)方法:
a、注释://in = Util.readVirtualFile(catalogUrl);
b、修改:def = xmlParser.parse(in) 为:
def = xmlParser.parse(Util.readVirtualFileAsString(catalogUrl))