Java动态调用脚本语言Groovy

来源:互联网 发布:淘宝商品上架下架时间 编辑:程序博客网 时间:2024/06/03 19:38

说下为什么要用grovvy,我们现在想写一个通用接口项目,改接口想实现系统A发送各种形式请求到我们,我们接受,根据配置将发送数组处理组装以其他形式发送到到系统B的一个东西。
支持数据类型 json xml webservice 等很多。
这个非常灵活要求配置完成。其中有一步是convertData,这一步数据映射很灵活配置实现特别繁琐故采用groovy来配置!

package com.senyint.util;import java.util.HashMap;import java.util.List;import java.util.Map;import javax.script.Bindings;import javax.script.Invocable;import javax.script.ScriptContext;import javax.script.ScriptEngine;import javax.script.ScriptEngineFactory;import javax.script.ScriptEngineManager;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.core.env.Environment;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import groovy.lang.Binding;import groovy.lang.Script;import groovy.util.GroovyScriptEngine;/** * @author hpym365 * @version 创建时间:2017年2月28日 下午9:06:55  * 类说明 java调用 groovy 学习 */@RestControllerpublic class Groovy {    @Autowired    Environment env;    /**     * @author hpym365     * @创建时间 2017年3月2日 下午10:07:47     * @desc 描述     * @param filepath     *            groovy脚本文件的路径(当参数为null默认指定工程路径下的groovy文件夹)     * @param filename     *            groovy脚本文件名字     * @param params     *            执行脚本的参数     * @return 返回执行结果     */    public Object runGroovyScriptByFile(String[] filepath, String filename, Map<String, Object> params) {        if (filepath == null || filepath.length == 0)            filepath = new String[] { "grovvy\\" };// 定义Groovy脚本引擎的根路径        try {            // String[]{".\\src\\main\\java\\com\\senyint\\util\\"}            GroovyScriptEngine engine = new GroovyScriptEngine(filepath);            return engine.run(filename, new Binding(params));        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();            return null;        }    }    /**     * @author hpym365     * @创建时间 2017年3月2日 下午10:17:42     * @desc 描述     * @param filepath     *            groovy脚本文件的路径(当参数为null默认指定工程路径下的groovy文件夹)     * @param filename     *            groovy脚本文件名字     * @param funname     *            执行指定的方法名称     * @param params     *            执行脚本的参数     * @return 返回执行结果     */    public Object runGroovyScriptByFile(String[] filepath, String filename, String funname, Object[] params) {        if (filepath == null || filepath.length == 0)            filepath = new String[] { "grovvy\\" };// 定义Groovy脚本引擎的根路径        try {            // String[]{".\\src\\main\\java\\com\\senyint\\util\\"}            GroovyScriptEngine engine = new GroovyScriptEngine(filepath);            Script script = engine.createScript(filename, new Binding());            return script.invokeMethod(funname, params);        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();            return null;        }    }    /**     * @author hpym365     * @创建时间 2017年3月2日 下午9:43:08     * @desc 执行groovy脚本(不指定方法)     * @param script     *            要执行的脚本 通过字符串传入,应用场景 如从数据库中读取出来的脚本等     * @param params     *            执行grovvy需要传入的参数     * @return 脚本执行结果     */    public Object runGroovyScript(String script, Map<String, Object> params) {        if (script == null || "".equals(script))            throw new RuntimeException("方法runGroovyScript无法执行,传入的脚本为空");        try {            ScriptEngineManager factory = new ScriptEngineManager();            ScriptEngine engine = factory.getEngineByName("groovy");            Bindings bindings = engine.createBindings();            bindings.putAll(params);            return engine.eval(script, bindings);        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();            return null;        }    }    /**     * @author hpym365     * @创建时间 2017年3月2日 下午9:43:08     * @desc 执行groovy脚本(需要指定方法名)     * @param script     *            要执行的脚本 通过字符串传入,应用场景 如从数据库中读取出来的脚本等     * @param funName     *            要执行的方法名     * @param params     *            执行grovvy需要传入的参数     * @return     */    public Object runGroovyScript(String script, String funName, Object[] params) {        try {            ScriptEngineManager factory = new ScriptEngineManager();            ScriptEngine engine = factory.getEngineByName("groovy");            // String HelloLanguage = "def hello(language) {return \"Hello            // $language\"}";            engine.eval(script);            Invocable inv = (Invocable) engine;            return inv.invokeFunction(funName, params);        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();            return null;        }    }    public void getScriptEngineFactoryList() {        ScriptEngineManager manager = new ScriptEngineManager();        List<ScriptEngineFactory> factories = manager.getEngineFactories();        for (ScriptEngineFactory factory : factories) {            System.out.printf(                    "Name: %s%n" + "Version: %s%n" + "Language name: %s%n" + "Language version: %s%n"                            + "Extensions: %s%n" + "Mime types: %s%n" + "Names: %s%n",                    factory.getEngineName(), factory.getEngineVersion(), factory.getLanguageName(),                    factory.getLanguageVersion(), factory.getExtensions(), factory.getMimeTypes(), factory.getNames());            // 得到当前的脚本引擎            ScriptEngine engine = factory.getScriptEngine();            System.out.println(engine);        }    }    public static void main(String[] args) {        Groovy groovy = new Groovy();        groovy.getScriptEngineFactoryList();        Map<String, Object> params = new HashMap<String, Object>();        params.put("language", "groovy test");        Object res = groovy.runGroovyScript("return \"Hello $language\"", params);        String script = "def hello(param1,param2) {return \"the params is $param1 and $param2\"}";        Object res1 = groovy.runGroovyScript(script, "hello", new String[] { "param1", "param2" });        System.out.println(res);        System.out.println(res1);        Object res3 = groovy.runGroovyScriptByFile(null, "hello.groovy", "hello", new String[] { "param3", "param4" });        System.out.println(res3);    }}
  • 1
  • 2

踩坑提示:

本地使用springboot 时候引用了thymeleaf,导致引入了groovy依赖不过不全!!
因为开始没引全groovy的包 导致我的
ScriptEngine engine = factory.getEngineByName(“groovy”);
一直是空指针 null point exception….搞了好久
pom文件增加


org.codehaus.groovy
groovy-all
2.4.7

引入之后问题解决
附hello.groovy

def hello(param1,param2) {    return "the params is $param1 and $param2"}

因为着急没写成工具类不过也差不多了 大家自己改一下。

原创粉丝点击