Spring 使用 Groovy 实现动态server

2024-05-11 16:52

本文主要是介绍Spring 使用 Groovy 实现动态server,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本人在项目中遇到这么个需求,有一个模块的server方法需要频繁修改
经阅读可以使用 Groovy 使用java脚本来时

pom坐标

<dependency><groupId>org.codehaus.groovy</groupId><artifactId>groovy</artifactId><version>3.0.9</version>
</dependency>

实例代码

public interface IGroovyHandler {List<JSONObject> transform(List<JSONObject> data);
}

动态加载

@Component
@Slf4j
public class GroovyTransformServiceImpl implements TransformStrategy {private GroovyClassLoader groovyClassLoader = new GroovyClassLoader();/*** 数据清洗转换 类型** @return*/@Overridepublic String type() {return "javaBean";}/**** 清洗转换算法接口* @param def* @param data* @return*/@Overridepublic List<JSONObject> transform(DataSetTransformDto def, List<JSONObject> data) {String transformScript = def.getTransformScript();Class<?> clazz = groovyClassLoader.parseClass(transformScript);if (clazz != null) {try {Object instance = clazz.newInstance();if (instance!=null) {if (instance instanceof IGroovyHandler) {IGroovyHandler handler = (IGroovyHandler) instance;return handler.transform(data);} else {System.err.println("转换失败!");}}} catch (Exception e) {log.info("执行javaBean异常", e);throw new RuntimeException(e.getMessage());}}return data;}
}

java 脚本 在idea中写好之后 转化成字符串 运行

package com;import com.alibaba.fastjson.JSONObject;
import com.anjiplus.template.gaea.business.modules.datasettransform.service.IGroovyHandler;import java.util.ArrayList;
import java.util.List;/*** 建议在idea写好复制整个类到此处,位置report-core/src/test/java/com/DemoGroovyHandler.java*/
public class DemoGroovyHandler implements IGroovyHandler {@Overridepublic List<JSONObject> transform(List<JSONObject> data) {for (JSONObject datum : data) {List<Double> value = new ArrayList<>();Double longitude = datum.getDouble("longitude");Double latitude = datum.getDouble("latitude");value.add(longitude);value.add(latitude);datum.put("value", value);datum.put("name", "");datum.remove("longitude")datum.remove("latitude")}return data;}
}

demo代码

import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;import java.lang.reflect.InvocationTargetException;public class GroovyTest {public static void main(String[] args) throws Exception {//test01();test02();}private static void test02() throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {GroovyClassLoader loader = new GroovyClassLoader();// java代码String java = "import java.sql.*;\n" +"import java.util.ArrayList;\n" +"import java.util.HashMap;\n" +"import java.util.List;\n" +"import java.util.Map;\n" +"\n" +"public class JDBCTest {\n" +"    \n" +"    private static List<Map> getData() {\n" +"        // 数据库URL,用户名和密码\n" +"        String url = \"jdbc:mysql://172.16.90.xxx:3306/xx\";\n" +"        String user = \"root\";\n" +"        String password = \"123456\";\n" +"\n" +"        Connection conn = null;\n" +"        Statement stmt = null;\n" +"        ResultSet rs = null;\n" +"        List<Map> data = new ArrayList<>();\n" +"        try {\n" +"            // 加载数据库驱动\n" +"            Class.forName(\"com.mysql.cj.jdbc.Driver\");\n" +"\n" +"            // 建立连接\n" +"            conn = DriverManager.getConnection(url, user, password);\n" +"\n" +"            // 创建Statement对象\n" +"            stmt = conn.createStatement();\n" +"\n" +"            // 执行查询\n" +"            rs = stmt.executeQuery(\"SELECT kdmc FROM frm_wlxx\");\n" +"\n" +"            // 获取结果集的元数据\n" +"            ResultSetMetaData rsmd = rs.getMetaData();\n" +"\n" +"            // 获取列数\n" +"            int columnsCount = rsmd.getColumnCount();\n" +"\n" +"            // 遍历每一行数据\n" +"            while (rs.next()) {\n" +"                Map obj = new HashMap();\n" +"                for (int i = 1; i <= columnsCount; i++) {\n" +"                    // 获取列名\n" +"                    String columnName = rsmd.getColumnName(i);\n" +"                    // 获取对应列的值\n" +"                    Object columnValue = rs.getObject(i);\n" +"\n" +"                    obj.put(columnName, columnValue);\n" +"\n" +"                }\n" +"                data.add(obj);\n" +"            }\n" +"            // 处理结果\n" +"//            while (rs.next()) {\n" +"//                String string = rs.getString(\"kdmc\");\n" +"\n" +"\n" +"//                String query =\"SELECT kdmc FROM frm_wlxx where kdmc=?\";\n" +"//\n" +"//                PreparedStatement pstmt = conn.prepareStatement(query);\n" +"//\n" +"//                pstmt.setString(1, string);\n" +"//\n" +"//                ResultSet child = pstmt.executeQuery();\n" +"//                while (child.next()) {\n" +"//                    String childObj = child.getString(\"kdmc\");\n" +"//                    System.out.println(childObj);\n" +"//                }\n" +"//            }\n" +"        } catch (Exception e) {\n" +"            e.printStackTrace();\n" +"        } finally {\n" +"            // 关闭资源\n" +"            try {\n" +"                if (rs != null) {\n" +"                    rs.close();\n" +"                    rs = null;\n" +"                }\n" +"                if (stmt != null) {\n" +"                    stmt.close();\n" +"                    stmt = null;\n" +"                }\n" +"                if (conn != null) {\n" +"                    conn.close();\n" +"                    conn = null;\n" +"                }\n" +"            } catch (Exception e) {\n" +"                e.printStackTrace();\n" +"            }\n" +"        }\n" +"        return data;\n" +"    }\n" +"}\n";Class scriptClass = loader.parseClass(java);GroovyObject scriptInstance = (GroovyObject) scriptClass.getDeclaredConstructor().newInstance();Object result = scriptInstance.invokeMethod("getData", new Object[]{});System.out.println("Groovy result=" + result);}private static void test01() throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {GroovyClassLoader loader = new GroovyClassLoader();// java代码String java = " " +"   public class Test { " +"      public int add(double a, double b) { " +"        double sum = a + b;  " +"         System.out.println(\"Script sum=\" + sum);  " +"         return sum.intValue(); " +"      }  " +"  } ";Class scriptClass = loader.parseClass(java);GroovyObject scriptInstance = (GroovyObject) scriptClass.getDeclaredConstructor().newInstance();Object result = scriptInstance.invokeMethod("add", new Object[]{1, 2});System.out.println("Groovy result=" + result);}}

这篇关于Spring 使用 Groovy 实现动态server的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/980114

相关文章

详解Vue如何使用xlsx库导出Excel文件

《详解Vue如何使用xlsx库导出Excel文件》第三方库xlsx提供了强大的功能来处理Excel文件,它可以简化导出Excel文件这个过程,本文将为大家详细介绍一下它的具体使用,需要的小伙伴可以了解... 目录1. 安装依赖2. 创建vue组件3. 解释代码在Vue.js项目中导出Excel文件,使用第三

Linux alias的三种使用场景方式

《Linuxalias的三种使用场景方式》文章介绍了Linux中`alias`命令的三种使用场景:临时别名、用户级别别名和系统级别别名,临时别名仅在当前终端有效,用户级别别名在当前用户下所有终端有效... 目录linux alias三种使用场景一次性适用于当前用户全局生效,所有用户都可调用删除总结Linux

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

Mysql虚拟列的使用场景

《Mysql虚拟列的使用场景》MySQL虚拟列是一种在查询时动态生成的特殊列,它不占用存储空间,可以提高查询效率和数据处理便利性,本文给大家介绍Mysql虚拟列的相关知识,感兴趣的朋友一起看看吧... 目录1. 介绍mysql虚拟列1.1 定义和作用1.2 虚拟列与普通列的区别2. MySQL虚拟列的类型2