java 执行动态的脚本(groovy) 调用Springboot的Service方法

功能目的:通过在线编写代码,使其项目具备动态调整java中已定义好的Service的方法,通过组合相关代码,灵活完成相应功能

操作步骤:

  1. 引入groovy jar包
  2. 定义执行器
  3. 定义示例 Service
  4. 定义 测试执行 Ctr
  5. 测试

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"
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值