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"}
因为着急没写成工具类不过也差不多了 大家自己改一下。
阅读全文
0 0
- Java动态调用脚本语言Groovy
- Java动态调用脚本语言Groovy,完善接口配置
- “Java脚本语言”Groovy
- java调用脚本语言笔记(jython,jruby,groovy)
- Groovy – Java的脚本语言
- Groovy – Java的脚本语言
- Groovy – Java的脚本语言
- Java调用脚本语言(JavaScript)
- java调用groovy小结
- java 中调用 groovy
- Groovy Java调用
- java中调用groovy脚本
- java调用、执行groovy代码
- Java和groovy相互调用
- jdk7 新特性-Java语言的动态性-脚本语言支持api-方法调用05
- Groovy基本使用(4):Java Groovy 相互调用
- java中调用lua脚本语言1
- java中调用lua脚本语言1
- 微信学习连接存档
- android 挪动dialog的位置
- SpringBoot--JSR303验证传入参数
- 【Android】第三方软件打开QQ发送消息
- wcsncat
- Java动态调用脚本语言Groovy
- Content-Range Content-Length
- android BLE蓝牙RSSI数据的读写
- springmvc + mongodb 整合
- docker初步学习
- 用JS获取地址栏参数的方法(超级简单)
- OpenCV参考手册之Mat类详解(二)
- QwtDemo-利用qwt进行实时曲线绘制实例
- ES6特性整理