当前位置: 首页 > news >正文

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;--如果替换字符整个为空字符 &#xff0c;则直接返回null select translate(abc你好cdefgdc,abcdefg,122)from dual; sel…...

算法-卡尔曼滤波之卡尔曼滤波的第二个方程:预测方程(状态外推方程)

在上一节中&#xff0c;使用了静态模型&#xff0c;我们推导出了卡尔曼滤波的状态更新方程&#xff0c;但是在实际情况下&#xff0c;系统都是动态&#xff0c;预测阶段&#xff0c;前后时刻的状态是改变的&#xff0c;此时我们引入预测方程&#xff0c;也叫状态外推方程&#…...

刘邦的创业团队是沛县人,朱元璋的则是凤阳;要创业,一个县人才就够了

当人们回顾刘邦和朱元璋的创业经历时&#xff0c;总是会感慨他们起于微末&#xff0c;都创下了偌大王朝&#xff0c;成就无上荣誉。 尤其是我们查阅史书时&#xff0c;发现这二人的崛起班底都是各自的家乡人&#xff0c;例如刘邦的班底就是沛县人&#xff0c;朱元璋的班底是凤…...

【Unity之FairyGUI】你了解FGUI吗,跨平台多功能高效UI插件

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…...

基于51单片机的自动浇花器电路

一、系统概述 自动浇水灌溉系统设计方案&#xff0c;以AT89C51单片机为控制核心&#xff0c;采用模块化的设计方法。 组成部分为&#xff1a;5V供电模块、土壤湿度传感器模块、ADC0832模数转换模块、水泵控制模块、按键输入模块、LCD显示模块和声光报警模块&#xff0c;结构如…...

2024中国(重庆)商旅文化川渝美食暨消费品博览会8月举办

2024中国(重庆)商旅文化川渝美食暨消费品博览会8月举办 邀请函 主办单位&#xff1a; 中国航空学会 重庆市南岸区人民政府 招商执行单位&#xff1a; 重庆港华展览有限公司 展会背景&#xff1a; 2024中国航空科普大会暨第八届全国青少年无人机大赛在重庆举办&#xff…...

MacOS docker 安装与配置

orbstack 安装 官网&#xff1a; https://orbstack.dev 下载链接&#xff1a;Download OrbStack Fast, light, simple Docker Desktop alternative 选择是Apple M系列处理器&#xff0c; 或 Intel系列处理器 到这里就安装好了Orbstack软件&#xff0c;下面开始配置docker 下…...

【嵌入式大赛应用赛道】机械手臂

电机 进步电机&#xff1a;它的转动是以确定的步数进行的&#xff0c;只要计算好脉冲数量和频率&#xff0c;就可以准确预测和控制电机的转动角度、速度以及停止的位置 伺服电机&#xff1a;将输入的电信号&#xff08;如电压或电流指令&#xff09;转换成轴上的精确旋转运动…...

MES系统主要包括那些功能?

一开始接触MES系统&#xff0c;对MES细条的功能不清楚&#xff0c;这样很正常&#xff0c;因为MES系统相对于其他系统来讲&#xff0c;功能有多又复杂! 作为曾参与200企业MES系统架构的资深从业人员&#xff0c;我给大家选出了一款优秀模板——简道云MES系统&#xff0c;给大家…...

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寄存器结构:主要功能和用途亲和级别&#xff08;Affinity Levels&#xff09;简介CORE ID 获取函数 在ARMv8-A架构中&#xff0c; MPIDR_EL1寄存器是一个非常重要的系统寄存器&#xff0c;它提供了关于处理器在其物理和逻辑配置中的位置的信息。…...

软件工程课程设计之酒店管理系统的设计与实现

这是一个简化的酒店管理系统的需求分析文档、系统设计文档、测试文档的结构概述&#xff0c;以及部分实现阶段的代码示例。详细设计阶段的数据字典、ER图、模块分类图将以文字描述形式给出&#xff0c;而完整的代码未完全实现。这里只做软件工程部分的设计需求说明哈&#xff5…...

函数递归练习

目录 1.分析下面选择题 2.实现求第n个斐波那契数 3.编写一个函数实现n的k次方&#xff0c;使用递归实现。 4.写一个递归函数DigitSum(n)&#xff0c;输入一个非负整数&#xff0c;返回组成它的数字之和 5.递归方式实现打印一个整数的每一位 6.实现求n的阶乘 1.分析下面选择…...

公有云Linux模拟TCP三次挥手与四次握手(Wireshark抓包验证版)

目录 写在前面环境准备实验步骤1. 安装nc工具2. 使用nc打开一个连接2.1 公有云-安全组放行对应端口&#xff08;可选&#xff09; 3. 打开Wireshark抓包工具4. 新开终端&#xff0c;进行连接5. 查看抓包文件&#xff0c;验证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 第三十四章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…...

国际化日期(inti)

我们可以使用国际化API自动的格式化数字或者日期&#xff0c;并且格式化日期或数字的时候是按照各个国家的习惯来进行格式化的&#xff0c;非常的简单&#xff1b; const now new Date(); labelDate.textContent new Intl.DateTimeFormat(zh-CN).format(now);比如说这是按照…...

【论文阅读笔记】jTrans(ISSTA 22)

个人博客地址 [ISSTA 22] jTrans&#xff08;个人阅读笔记&#xff09; 论文&#xff1a;《jTrans: Jump-Aware Transformer for Binary Code Similarity》 仓库&#xff1a;https://github.com/vul337/jTrans 提出的问题 二进制代码相似性检测&#xff08;BCSD&#xff0…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...