概述
说下为什么要用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 {
@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);
}
}
踩坑提示:
本地使用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"
}
因为着急没写成工具类不过也差不多了 大家自己改一下。
最后
以上就是正直帽子为你收集整理的Java动态调用脚本语言Groovy,完善接口配置的全部内容,希望文章能够帮你解决Java动态调用脚本语言Groovy,完善接口配置所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复