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
本人在项目中遇到这么个需求,有一个模块的server方法需要频繁修改 经阅读可以使用 Groovy 使用java脚本来时pom坐标 <dependency><groupId>org.codehaus.groovy</groupId><artifactId>groovy</artifactId><version>3.0.9</version>…...
oracle不得不知道的sql
一、oracle 查询语句 1.translate select translate(abc你好cdefgdc,abcdefg,1234567)from dual; select translate(abc你好cdefgdc,abcdefg,)from dual;--如果替换字符整个为空字符 ,则直接返回null select translate(abc你好cdefgdc,abcdefg,122)from dual; sel…...
算法-卡尔曼滤波之卡尔曼滤波的第二个方程:预测方程(状态外推方程)
在上一节中,使用了静态模型,我们推导出了卡尔曼滤波的状态更新方程,但是在实际情况下,系统都是动态,预测阶段,前后时刻的状态是改变的,此时我们引入预测方程,也叫状态外推方程&#…...
刘邦的创业团队是沛县人,朱元璋的则是凤阳;要创业,一个县人才就够了
当人们回顾刘邦和朱元璋的创业经历时,总是会感慨他们起于微末,都创下了偌大王朝,成就无上荣誉。 尤其是我们查阅史书时,发现这二人的崛起班底都是各自的家乡人,例如刘邦的班底就是沛县人,朱元璋的班底是凤…...
【Unity之FairyGUI】你了解FGUI吗,跨平台多功能高效UI插件
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:就业…...
基于51单片机的自动浇花器电路
一、系统概述 自动浇水灌溉系统设计方案,以AT89C51单片机为控制核心,采用模块化的设计方法。 组成部分为:5V供电模块、土壤湿度传感器模块、ADC0832模数转换模块、水泵控制模块、按键输入模块、LCD显示模块和声光报警模块,结构如…...
2024中国(重庆)商旅文化川渝美食暨消费品博览会8月举办
2024中国(重庆)商旅文化川渝美食暨消费品博览会8月举办 邀请函 主办单位: 中国航空学会 重庆市南岸区人民政府 招商执行单位: 重庆港华展览有限公司 展会背景: 2024中国航空科普大会暨第八届全国青少年无人机大赛在重庆举办ÿ…...
MacOS docker 安装与配置
orbstack 安装 官网: https://orbstack.dev 下载链接:Download OrbStack Fast, light, simple Docker Desktop alternative 选择是Apple M系列处理器, 或 Intel系列处理器 到这里就安装好了Orbstack软件,下面开始配置docker 下…...
【嵌入式大赛应用赛道】机械手臂
电机 进步电机:它的转动是以确定的步数进行的,只要计算好脉冲数量和频率,就可以准确预测和控制电机的转动角度、速度以及停止的位置 伺服电机:将输入的电信号(如电压或电流指令)转换成轴上的精确旋转运动…...
MES系统主要包括那些功能?
一开始接触MES系统,对MES细条的功能不清楚,这样很正常,因为MES系统相对于其他系统来讲,功能有多又复杂! 作为曾参与200企业MES系统架构的资深从业人员,我给大家选出了一款优秀模板——简道云MES系统,给大家…...
git 合并commit
操作步骤 合并commit cd xxx/ git checkout a8c0efegfwgtw # 最新commit git reset rhgertheryhg --soft # 最初的commit git status git checkout -b test1 git commit -m "test1" git branch git push origin test1 git tag test1_v0.0.1 git push origin test1_…...
【ARMv8/v9 系统寄存器 5 -- CPU ID 判断寄存器 MPIDR_EL1 使用详细介绍】
文章目录 寄存器名称: MPIDR_EL1寄存器结构:主要功能和用途亲和级别(Affinity Levels)简介CORE ID 获取函数 在ARMv8-A架构中, MPIDR_EL1寄存器是一个非常重要的系统寄存器,它提供了关于处理器在其物理和逻辑配置中的位置的信息。…...
软件工程课程设计之酒店管理系统的设计与实现
这是一个简化的酒店管理系统的需求分析文档、系统设计文档、测试文档的结构概述,以及部分实现阶段的代码示例。详细设计阶段的数据字典、ER图、模块分类图将以文字描述形式给出,而完整的代码未完全实现。这里只做软件工程部分的设计需求说明哈࿵…...
函数递归练习
目录 1.分析下面选择题 2.实现求第n个斐波那契数 3.编写一个函数实现n的k次方,使用递归实现。 4.写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和 5.递归方式实现打印一个整数的每一位 6.实现求n的阶乘 1.分析下面选择…...
公有云Linux模拟TCP三次挥手与四次握手(Wireshark抓包验证版)
目录 写在前面环境准备实验步骤1. 安装nc工具2. 使用nc打开一个连接2.1 公有云-安全组放行对应端口(可选) 3. 打开Wireshark抓包工具4. 新开终端,进行连接5. 查看抓包文件,验证TCP三次握手与四次挥手TCP三次握手数据传输TCP四次挥…...
【Day3:JAVA运算符、方法的介绍】
目录 1、运算符1.1 赋值运算符1.2 比较运算符1.3 逻辑运算符1.3.1 逻辑运算符概述1.3.2 逻辑运算符分类1.3.3 短路的逻辑运算符 1.4 三元运算符1.5 运算符优先级 2、方法2.1 方法介绍2.2 方法的定义和调用格式2.2.1 方法的调用2.2.2 带参数方法的调用2.2.3 带返回值方法的调用2…...
Chrome查看User Agent的实战教程
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...
Linux 第三十四章
🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,linux 🔥座右铭:“不要等到什么都没有了…...
国际化日期(inti)
我们可以使用国际化API自动的格式化数字或者日期,并且格式化日期或数字的时候是按照各个国家的习惯来进行格式化的,非常的简单; const now new Date(); labelDate.textContent new Intl.DateTimeFormat(zh-CN).format(now);比如说这是按照…...
【论文阅读笔记】jTrans(ISSTA 22)
个人博客地址 [ISSTA 22] jTrans(个人阅读笔记) 论文:《jTrans: Jump-Aware Transformer for Binary Code Similarity》 仓库:https://github.com/vul337/jTrans 提出的问题 二进制代码相似性检测(BCSD࿰…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
算法250609 高精度
加法 #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; char input1[205]; char input2[205]; int main(){while(scanf("%s%s",input1,input2)!EOF){int a[205]…...
