功能目的:通过在线编写代码,使其项目具备动态调整java中已定义好的Service的方法,通过组合相关代码,灵活完成相应功能
操作步骤:
- 引入groovy jar包
- 定义执行器
- 定义示例 Service
- 定义 测试执行 Ctr
- 测试
1 . 依赖jar包:
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.3.11</version>
</dependency>
2. 执行器
import groovy.lang.Binding;
import groovy.lang.GroovyShell;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
@Component
public class GroovyScriptExecutor {
private final ApplicationContext applicationContext;
@Autowired
public GroovyScriptExecutor(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
public Object executeScript(String script) {
Binding binding = new Binding();
binding.setVariable("applicationContext", applicationContext);
GroovyShell shell = new GroovyShell(binding);
return shell.evaluate(script);
}
}
3. 示例Service
涉及的 StuVO类 就是普通的VO
import org.springframework.stereotype.Service;
import cn.wuhongbox.cloud.bpit.apps.groovy.StuVO;
@Service("MyGroovyService")
public class MyGroovyService {
public String sayHello(String name) {
return "Hello, " + name + "!";
}
public String sayHello(StuVO stu) {
// 对象参数
return "Hello, " + stu.getId() + " " + stu.getName() + "!";
}
public StuVO sayHello(String id, String name) {
StuVO stu = new StuVO();
stu.setId(id);
stu.setName(name);
return stu;
}
}
4. 测试用的 Ctr
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/groovy/demo")
public class DemoBussCtr {
public static final Logger log = LoggerFactory.getLogger(DemoBussCtr.class);
@Autowired
private GroovyScriptExecutor groovyScriptExecutor;
@PostMapping("/run")
public Object run(@RequestBody String groovyScript) {
Object res = groovyScriptExecutor.executeScript(groovyScript);
return res ;
}
5. 测试
示例1:普通参数
body参数 (groovy脚本)
def myService = applicationContext.getBean('MyGroovyService');
def result = myService.sayHello('Groovy');
return result;
结果
Hello, Groovy!
示例2:对象参数
本示例,调用时,参数是对象,需要通用 import 对象。要与Service的参数对象类型保持一致
body参数 (groovy脚本)
import cn.wuhongbox.cloud.bpit.apps.groovy.StuVO;
def myService = applicationContext.getBean('MyGroovyService');
StuVO stu = new StuVO(); // 这样也可以 def stu = new StuVO();
stu.setId("123");
stu.setName("groovy");
def result = myService.sayHello(stu);
return result;
结果
Hello, 123 groovy!
示例3:返回对象
body参数 (groovy脚本)
import cn.wuhongbox.cloud.bpit.apps.groovy.StuVO;
def myService = applicationContext.getBean('MyGroovyService');
StuVO result = myService.sayHello('123','groovy');
return result;
结果
{
"id": "123",
"name": "groovy"
}