项目中用到了规则引擎,后来选用了drools开源的实现,后来部署的linux环境后乱码,在本地不乱码,所以第一时间就想到了应该是drools内部取了操作系统默认的编码了。
首先我们知道,凡是乱码基本上是字节和字符之间相互转换的时候出现的,经过仔细排查,发现将规则文件加入到session里面的时候没有给编码,于是加上。
-
加载规则文件的时候必须指定编码,比如UTF-8
中文乱码代码: Reader reader = new FileReader(new File("F:/WorkFolder/drools/drl/addpoint.drl")); 解决方法: Reader reader = new InputStreamReader(new FileInputStream("F:/WorkFolder/drools/drl/addpoint.drl"),"UTF-8");
加上这一处编码还是不行,后来发现我们用的decisiontable的解码是用的jxl,在网上看,jxl的解析也有可能产生乱码,于是加上 -
给容器启动的时候设置jxl的编码
System.setProperty("jxl.encoding", "UTF-8");
加上这两个系统参数,也是乱码,经过调试发现,org.drools.rule.builder.dialect.java.JavaDialect类里面的addClassCompileTask方法有将字符超字节转换的代码,如下:public void addClassCompileTask(final String className, final BaseDescr descr, final String text, final MemoryResourceReader src, final ErrorHandler handler) { final String fileName = className.replace( '.', '/' ) + ".java"; try { if (src != null) { src.add( fileName, text.getBytes() ); } else { this.src.add( fileName, text.getBytes() ); } } catch (final UnsupportedEncodingException e ) { throw new RuntimeException("unable to encoding the rule!"); } this.errorHandlers.put( fileName, handler ); addClassName( fileName ); }
我们再来看一下String的getBytes方法的实现,这个方法里面默认取平台的编码的,至此,我们就知道病根了,所以比较简单了,加上-Dfile.encoding=UTF8参数就可以了,注意,这个地方是UTF8,不是UTF-8,具体的解释看官方文档: http://docs.oracle.com/javase/6/docs/technotes/guides/intl/encoding.doc.html,最后这个也是在tomcat的启动参数里面加上-Dfile.encoding=UTF8 - 在tomcat的启动参数里面加上-Dfile.encoding=UTF8
CATALINA_OPTS="-Xmx1024m -Xms1024m -XX:PermSize=256m -XX:MaxPermSize=512m -Xss128k -server -Xdebug -Xnoagent -Djav
a.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8530 -Dfile.encoding=UTF8"
- 在maven跑junit测试的时候加上这个参数-Dfile.encoding=UTF-8
如果不加这个测试,在junit跑测试的时候还会使用操作系统的默认字符集,会导致测试失败
<plugin> <artifactId>maven-surefire-plugin</artifactId> <groupId>org.apache.maven.plugins</groupId> <version>2.11</version> <configuration> <argLine>-Dfile.encoding=utf-8</argLine> <parallel>methods</parallel> <threadCount>10</threadCount> <includes> <include>**/*Test.java</include> </includes> <excludes> <exclude>**/BaseControllerTest.java</exclude> <exclude>**/BaseTest.java</exclude> <exclude>**/TestUtils.java</exclude> </excludes> </configuration> </plugin>
相关推荐
drools4.0.7 utf-8中文乱码
drools drools drools drools drools
drools最新版本学习资料,里面系统的介绍了drools规则引擎的简介以及集成到项目的教程内容。欢迎下载,收集不易,欢迎点赞。
我的drools3
Drools7_PDF教程 Drools中文文档 内容全面。 1. 内容更加全面,更多细节,更多知识点全部在新版本中有所体现,并且会附上小编做的例子 ,更多内容不断更新中 2. 目前国内最全的Drools中文文档。也是目前国内唯一一本
Drools开发最全中文版技术指南。 Drools开发最全中文版技术指南,介绍了常见的drools如何进行开发,注意是:中文版中文版中文版! drools 中文文档 规则引擎 drools6 drools7 Java
Drools中文使用教程 Drools(JBoss Rules )具有一个易于访问企业策略、易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快、效率高。业务分析师或审核人员可以利用它轻松查看业务规则,从而检验是否已...
drools中文文档pdf完整版本,drools 新版本功能,技术开发细节及api说明
drools开发中文文档!
drools
Drools4.0是从之前的Drools3.0.x系列以来的一次主要更新。在语言表达式,引擎性能和工具实用性方面都有一整套的新特性开发完成。
drools 最新文档 7.10 规则引擎中文文档,含 规则可视化操作说明,规则配置说明等; Drools 实现和提供了 Rete 算法;也曾提供 Leaps,但因为它无人维护而撒销了。Drools Rete 实现也被称为 ReteOO
Drools7.25中文文档:包括workbench與kie-server的安裝,如何調用kie-server以及集成workbench到自己的應用中.
drools5.1_开发中文文档drools5.1_开发中文文档drools5.1_开发中文文档drools5.1_开发中文文档
drools入门规则引擎,内含决策表,经测可用,比较适合入门者学习,决策树亦可以指导非IT人员操作。 决策表使用起来有点麻烦,需要和业务部门多沟通(密码:Droolszn
9 Drools WorkBench使用9.1 WorkBench基本使用9.2 创建会话9.3 编译并部署9.4 执行代码10 Drools决策表入门11 Drools决策表加强12 Drools决策表整合Springboot和MybatiesPlus13 动态编译Class文件实现Drools规则调用...
规则引擎Drools使用手册(中文),对于学习和研究Drools技术很有帮助的~~
Drools是一个Java语言版本的基于Charles Forgy's Rete算法研究的规则引擎实现。结合Rete到一个面向对象接口中,允许业务对象处理业务表达式。Drools由Java语言开发,但是可以运行在Java环境和.NET环境下。 Drools被...
drools动态生成规则文件