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

相关文章

MyBatis-Plus逻辑删除实现过程

《MyBatis-Plus逻辑删除实现过程》本文介绍了MyBatis-Plus如何实现逻辑删除功能,包括自动填充字段、配置与实现步骤、常见应用场景,并展示了如何使用remove方法进行逻辑删除,逻辑删... 目录1. 逻辑删除的必要性编程1.1 逻辑删除的定义1.2 逻辑删php除的优点1.3 适用场景2.

SpringBoot简单整合ElasticSearch实践

《SpringBoot简单整合ElasticSearch实践》Elasticsearch支持结构化和非结构化数据检索,通过索引创建和倒排索引文档,提高搜索效率,它基于Lucene封装,分为索引库、类型... 目录一:ElasticSearch支持对结构化和非结构化的数据进行检索二:ES的核心概念Index:

Python数据验证神器Pydantic库的使用和实践中的避坑指南

《Python数据验证神器Pydantic库的使用和实践中的避坑指南》Pydantic是一个用于数据验证和设置的库,可以显著简化API接口开发,文章通过一个实际案例,展示了Pydantic如何在生产环... 目录1️⃣ 崩溃时刻:当你的API接口又双叒崩了!2️⃣ 神兵天降:3行代码解决验证难题3️⃣ 深度

Linux内核定时器使用及说明

《Linux内核定时器使用及说明》文章详细介绍了Linux内核定时器的特性、核心数据结构、时间相关转换函数以及操作API,通过示例展示了如何编写和使用定时器,包括按键消抖的应用... 目录1.linux内核定时器特征2.Linux内核定时器核心数据结构3.Linux内核时间相关转换函数4.Linux内核定时

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝

python中的flask_sqlalchemy的使用及示例详解

《python中的flask_sqlalchemy的使用及示例详解》文章主要介绍了在使用SQLAlchemy创建模型实例时,通过元类动态创建实例的方式,并说明了如何在实例化时执行__init__方法,... 目录@orm.reconstructorSQLAlchemy的回滚关联其他模型数据库基本操作将数据添

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配