drools4.0.7 utf-8中文乱码

本周一直在解决drools4.0.7规则引擎中的乱码问题。经过对drools4.0各个版本的测试(4.0.0 , 4.0.4 ,4.0.7),4.0.0:虽然能很好的用utf-8输出中文,但是由于其规则文件只能接受一个function,当大于一个function时就会导致stackoverflow的异常,所以不得不放弃。后来采用目前官网上最新的4.0版本 4.0.7,function方式已经解决。换了4.0.7版本后,本地测试(main)ok,但是尝试了多个eclipseJDTcore无法正常部署在jboss上运作,因而改用janino,可以正常运行。

ps: 使用janino的方法如下:

PackageBuilder是可以配置的,使用PackageBuilderConfiguration。通常,你可以指定另一个parent ClassLoader和用什么编译器(compiler),默认是Eclipse JDT。下面显示了如何指定JANINO编译器:

PackageBuilderConfiguration conf = new PackageBuilderConfiguration();

conf.setCompiler( PackageBuilderConfiguration.JANINO );

PackageBuilder builder = new PackageBuilder( conf );

开发环境统一采用了utf-8,然而此时运行规则后的结果中文部分全变成了乱码,经过调试drools的源代码,发现 drools的源代码中 org.drools.rule.builder.dialect.java.JavaDialect 类中 public void compileAll() 方法里 File dumpDir = this.configuration.getPackageBuilderConfiguration().getDumpDir(); 中得到的文件并非utf-8编码。在addClassCompileTask方法中是text是用getBytes方法(无参数)add进src的。因此,在addClassCompileTask 方法中,将src.add(fileName, text.getBytes())方法加入我们需要的utf-8参数,将其用utf-8编码,问题终于解决。(getBytes默认是platform’s default charset)

具体代码代码如下:

private void addClassCompileTask(final String className,
   final BaseDescr descr, final String text,
   final MemoryResourceReader src, final ErrorHandler handler)
 {

  final String fileName = className.replace('.', '/') + ".java";

  try
  {
   src.add(fileName, text.getBytes((String) System
     .getProperty("myproject.drools.encoding")));
   // 在运行规则前可将 自定义"myproject.drools.encoding" 属性设为"utf-8"即可;

//System.setProperty("myproject.drools.encoding","utf-8");
  } catch (UnsupportedEncodingException e)
  {
   throw new RuntimeException(e);
  }

  this.errorHandlers.put(fileName, handler);

  addClassName(fileName);
 }

oracle默认的输入编码为GBK,输出的编码为utf-8,因此从数据库中用utf-8的方式读入规则字符串,一切正常。

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦