java如何将执行的GROOVY脚本结果返回到RESTAPI响应
我正在SpringBoot中开发一个RESTAPI,它将接受请求体中的任何groovy脚本,并将在服务器上执行它并返回执行结果。我试图找出如何获得脚本的执行结果,即使脚本显式地不返回任何值。它就像一个在线groovy编译器,您可以在其中发布代码并获得结果
import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyShell;
import groovy.lang.Script;
public class GroovyController {
public static void main(String[] args) throws ScriptException {
System.out.println(runScript());
}
public static String runScript(){
String script = "class Student {\n" +
" private int StudentID;\n" +
" private String StudentName;\n" +
"\t\n" +
" void setStudentID(int pID) {\n" +
" StudentID = pID;\n" +
" }\n" +
"\t\n" +
" void setStudentName(String pName) {\n" +
" StudentName = pName;\n" +
" }\n" +
"\t\n" +
" int getStudentID() {\n" +
" return this.StudentID;\n" +
" }\n" +
"\t\n" +
" String getStudentName() {\n" +
" return this.StudentName;\n" +
" }\n" +
"\t\n" +
" static void main(String[] args) {\n" +
" Student st = new Student();\n" +
" st.setStudentID(1);\n" +
" st.setStudentName(\"Joe\");\n" +
"\t\t\n" +
" println(st.getStudentID());\n" +
" println(st.getStudentName());\n" +
" } \n" +
"}";
GroovyShell shell = new GroovyShell();
Object result = shell.evaluate(script);
return result.toString();
}
}
# 1 楼答案
我想知道如何在安全的沙箱模型中用java运行groovy脚本。我使用Groovy Shell类的run方法用java运行groovy脚本。如果执行的脚本本身返回任何值,比如^{,Run方法将返回结果。如果脚本没有任何return语句,shell的Run方法将返回null,Run方法将返回结果
在
println("Hello world!!")
的情况下,它不会返回任何明显的结果,但在API的请求负载中发送此脚本的客户端将期望得到打印文本的响应。为了捕获PrintStream编写的内容,可以使用绑定将定制PrintWriter绑定到GroovyShell中的out对象。我已经编写了一个完整的基于Spring Boot的微服务,它公开了一个REST API来执行Groovy脚本。服务器处于安全的沙箱模型中完整的微服务代码可以在这里找到Script Execution Service