Java动态调用脚本语言Groovy
说下为什么要用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 学习*/
@RestController
public class Groovy {@AutowiredEnvironment 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 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 blocke.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 blocke.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 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 blocke.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 blocke.printStackTrace();return null;}}public void getScriptEngineFactoryList() {ScriptEngineManager manager = new ScriptEngineManager();List 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 params = new HashMap();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"
}因为着急没写成工具类不过也差不多了 大家自己改一下。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
