在SpringBoot中Java调用JS,实现即配即用API

文章提出了一个通过Java接口结合JS脚本实现动态配置接口流程的方法。通过定义IFlowType接口和四个实现类(读取数据、数据校验、数据执行、数据转换),结合FlowBean配置对象,允许灵活配置不同流程。同时,利用JavaScript的直接执行特性,将变动逻辑以JS存储在数据库中,实现了逻辑修改的即时生效,提高了接口的灵活性。
摘要由CSDN通过智能技术生成

之前写过一个关于通过一个接口完成对库的查询记录的文章,当时的想法并不是很完善,现在想通过java+js脚本实现即配即用接口。
一般情况下一个接口包含以下几个流程
1,数据读取,数据读取又包含:(读取数据流程)
a,从request中读取。
b,从header中读取,
c,从session中读取,
d,从redis中读取,
等等,
但是这些读取数据基本都是给定一个key,从某个地方获取值,有规律可循
2,数据校验(数据校验流程)
数据校验一般都是给定值,给定校验规则,如果符合要求则校验通过,否在校验不通过抛出异常
3,获取数据(数据执行流程)
a,从数据库获取数据
查询数据库一般都是通过一些条件,拼接出sql语句,交由JDBC执行
b,调用其他接口获取数据
根据组织的参数调用其他第三方接口获取数据
等等其他获取数据方式
4,数据转换(读取转换流程)
数据转换将给定的数据转换为其他格式
以上4个流程其实也是一个循环,但基本都是串行,如果定义一个接口如:

public interface IFlowType extends IConfig {
    default int order() {
        return 1;
    }

    /**
     * 执行流程的核心方法
     *
     * @param object    上个流程的入参
     * @param configObj 该流程的配置
     * @return
     */
    Object exeFlow(Object object, Object configObj);
}

基于该接口做4个实现

// 读取数据流程
public class ReadParamFlow implements IFlowType {
	@Override
    public Object exeFlow(Object object, Object config) {
		// 这里根据传入的配置,读取数据
		Map<String, Object> params = new HashMap<String, Object>();
		return params;
	}
	@Override
    public String getName() {
		return "readParamsFlow";
	}
}
// 数据校验流程
public class CheckParamFlow implements IFlowType {
	@Override
    public Object exeFlow(Object object, Object config) {
		// 这里根据传入的配置,进行参数校验
		return object;
	}
	@Override
    public String getName() {
		return "checkParamsFlow";
	}
}
// 数据执行流程
public class DataSourceFlow implements IFlowType {
	@Override
    public Object exeFlow(Object object, Object config) {
		// 这里根据传入的配置,获取参数,如查询数据库
		return object;
	}
	@Override
    public String getName() {
		return "dataSourceFlow";
	}
}
// 数据转换流程
public class DataConvertFlow implements IFlowType {
	@Override
    public Object exeFlow(Object object, Object config) {
		// 这里根据传入的配置,对object数据做转换
		return object;
	}
	@Override
    public String getName() {
		return "dataConvertFlow";
	}
}

以上4个实现对应4个流程,每个流程依赖config配置,我们再定义一个流程配置对象


/**
 * 流程定义
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class FlowBean {
    /**
     * 流程类型
     */
    private String flowType;
    /**
     * 流程配置
     */
    private Object flowConfig;
}

这样我就可以通过FlowBean的配置在这4个流程中进行调用,并且流程可重复执行,只要配置不一样就会获取不一样的结果。
但是java语言有个特性,必须进行编译,然后才能执行,但是javascript脚本能直接执行,所以我们的每个流程通过js实现核心逻辑,并将js配置到数据库,即可实现即配即用的能力。

// 从数据库查询到js缓存到Map中
private void reloadJs(String jsName, Map<String, Object> objectMap) {
        String jsContent = (String) objectMap.get("jsContent");
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine javaScript = manager.getEngineByName("JavaScript");
        try {
            javaScript.eval(jsContent + systemJsStr());
        } catch (ScriptException e) {
            e.printStackTrace();
            return;
        }
        log.info("reloadJs:{}", jsName);
        cacheScript.put(jsName, javaScript);
    }
    /**
     * 执行js方法
     *
     * @param jsName
     * @param params
     * @return
     * @throws ScriptException
     * @throws NoSuchMethodException
     */
    private String exe(String jsName, Object params) throws ScriptException, NoSuchMethodException {
        String jsonParams = JSONObject.toJSONString(params);
        // reloadJs(jsName);
        if (!cacheScript.containsKey(jsName)) {
            reloadJs(jsName);
        }
        if (!cacheScript.containsKey(jsName)) {
            log.error("无效的[" + jsName + "]");
            getJsExeException().jsNoSuchCodeException();
        }
        ScriptEngine javaScript = cacheScript.get(jsName);
        if (javaScript instanceof Invocable) {
            String resultJson = (String) ((Invocable) javaScript).invokeFunction("sysJsMain", jsonParams);
            return resultJson;
        }
        return null;
    }

这样我们就可以将重复变动的逻辑通过js的方式进行实现,并将js放到数据库中,如何逻辑修改我们只需要重写reloadJs这段js代码即可。
配置API
在这里插入图片描述
某个API的具体配置
在这里插入图片描述
配置JS
在这里插入图片描述
具体JS代码
在这里插入图片描述
这里是接口调用结果
在这里插入图片描述
不知各位元芳怎么看?欢迎各位留言讨论!!!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值