Spel 表达式

模板占位替换,在项目开发中,还是很常用的。比如在代码中获取参数,消息推送可以使用变量占位,我比较推荐使用 SPEL 表达式。

  1. 在注解中,获取方法的参数
public class SpElParser {private static final ExpressionParser parser = new SpelExpressionParser();public static String getKey(String key, String [] parameterNames, Object [] args) {Expression expression = parser.parseExpression(key);EvaluationContext context = new StandardEvaluationContext();if (args.length == 0) {return null;}for (int i = 0; i < args.length; i++) {context.setVariable(parameterNames[i], args[i]);}return expression.getValue(context, String.class);}}

用法:

@LogRecord(logBizId = “#dto.id”)

@LogRecord(logBizId = “#dto.id + ‘_’ + #dto.name”)

  1. 模板占位替换
    public static String convert(String content, Map<String, String> paramMap) {if (!StringUtils.hasText(content) || CollectionUtils.isEmpty(paramMap)) {return content;}ExpressionParser parser = new SpelExpressionParser();TemplateParserContext parserContext = new TemplateParserContext();return parser.parseExpression(content, parserContext).getValue(paramMap, String.class);}public static String convert(String content, String json) {if (!StringUtils.hasText(content) || !StringUtils.hasText(json)) {return content;}Map<String, String> paramMap = JacksonUtils.jsonObject(json,new TypeReference<Map<String, String>>() {});return convert(content, paramMap);}
{"name":"张三"
}

用法1,变量占位替换

String content = "#{[name]}";

用法2,变量占位替换 + 字符串拼接

String content = "#{'Hello, ' + [name] + '!'}"; 

用法3,判断变量是否为空

String content = "#{[name1] != null ? 'Hello, ' + [name1] + '!' : ''}"; 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/780900.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于机器视觉的智能物流机器人的设计与开发

标题&#xff1a;基于机器视觉的智能物流机器人的设计与开发 摘要&#xff1a; 随着电子商务和物流行业的快速发展&#xff0c;智能物流机器人作为一种高效、准确的自动化解决方案&#xff0c;正逐渐受到广泛关注。本文围绕基于机器视觉技术的智能物流机器人的设计与研发展开&…

HarmonyOS实战开发-如何实现一个简单的电子相册应用开发

介绍 本篇Codelab介绍了如何实现一个简单的电子相册应用的开发&#xff0c;主要功能包括&#xff1a; 实现首页顶部的轮播效果。实现页面跳转时共享元素的转场动画效果。实现通过手势控制图片的放大、缩小、左右滑动查看细节等效果。 相关概念 Swiper&#xff1a;滑块视图容…

java多线程中的阻塞队列

一、普通不阻塞队列 还记得队列我们如何实现吗&#xff1f;我们用的是循环队列的方式&#xff0c;回一下&#xff1a; 描述&#xff1a;开始tail和head指针都指向最开始位置&#xff0c;往里面添加元素tail&#xff0c;出元素head 初始状态&#xff1a; put元素后状态 take…

账号微服务短信验证码发送工具单元测试

账号微服务短信验证码发送工具单元测试 注意sms的 app-code #----------sms短信配置-------------- sms:app-code: dd7829bedfaf4373875aa91abba82523template-id: JM1000372package net.xdclass.config;import org.springframework.context.annotation.Bean; import org.spri…

ROS 2边学边练(4)-- 何为主题(topics)

概念 主题是一种节点间的通信方式&#xff0c;某个节点充当发布特定&#xff08;主题&#xff09;消息&#xff08;数据&#xff09;的角色&#xff0c;另外一些节点则可以订阅接收该特定&#xff08;主题&#xff09;消息&#xff08;数据&#xff09;。两者&#xff0…

在ubuntu上搭建系统监控系统

大纲 数据生产方安装和运行验证 数据收集、存储和分发方下载和解压修改配置运行验证 数据消费方下载和运行验证新增数据源新增看板关联看板和数据源效果展现 参考资料 在一个监控系统中&#xff0c;一定会有“数据生产方”和“数据消费方”存在。“数据生产方”用于产出需要监控…

Android MediaRecorder

AndroidManifest.xml中添加权限标记 <uses-permission android:name"android.permission.RECORD_AUDIO"/> 动态添加权限MainActivity requestPermissions(new String[]{Manifest.permission.CAMERA,Manifest.permission.RECORD_AUDIO},100); 创建MediaReco…

Go build 交叉编译-实现多平台兼容

【前言】 本章主要讲的是go程序如何兼容各种架构系统以及架构之间的区别 直接上干货&#xff0c;直接执行下面的指令&#xff0c;将GOOS&#xff08;平台&#xff09;和GOARCH&#xff08;架构&#xff09;就可以解决大部分架构兼容问题 GOOSlinux GOARCHamd64 go build test.g…

使用Asible自动化Linux管理任务

自动化与 Linux 系统管理 多年来&#xff0c;大多数系统管理和基础架构管理都依赖于通过图形或命令行用户界面执行的手动任务。系统管理员通常使用检查清单、其他文档或记忆的例程来执行标准任务。 这样的做法容易出错。系统管理员很容易跳过某个步骤或在某个步骤上出错。对步骤…

Flask学习(五):session相关流程

流程图如下图所示&#xff1a; 调用相关类如下图所示&#xff1a; 相关代码如下&#xff1a; from flask import Flask, sessionapp Flask(__name__)1. 加密会话数据&#xff1a;在 Flask 中&#xff0c;会话数据存储在客户端的 cookie 中。设置 app.secret_key 可以加密会话…

OLED模块

OLED模块 综述&#xff1a;本篇文章简要讲述了oled的定义&#xff0c;两种oled的引脚和接线情况、iic通讯协议、spi通讯协议、OLED代码引用和注意事项。 1.定义 OLED&#xff08;Organic Light-Emitting Diode&#xff09;模块是一种使用有机发光二极管作为显示元素的显示模…

【强化学习概念01】什么是 Q-Learning:了解 Q-Learning 的最佳指南

​ 一、说明 强化训练如同训狗。当狗或孩子行为不端时,你会怎么做?你责骂他们以确保他们不会重复或学习不良行为。另一方面,如果他们做了好事,你就会奖励他们,灌输良好的行为。不管你相信与否,这种正强化或负强化系统也可用于训练机器。它被称为强化学习,它可以帮助我…

DFS:二叉树的深搜与回溯

一、计算布尔二叉树的值 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool evaluateTree(TreeNode* root) {if(root->leftnullptr) return root->val0?false:true; bool left evaluateTree(root->left);bool rightevaluateTree(root->rig…

1.1 单片机的概念

一,单片机的概念 单片机(Single-Chip Microcomputer),也被称为单片微控制器,是一种集成电路芯片。它采用超大规模集成电路技术,将具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、…

Ubuntu20.04彻底删除mysql,并重装mysql

彻底卸载 sudo apt purge mysql-* sudo rm -rf /etc/mysql/ /var/lib/mysql sudo apt autoremove sudo apt autocleanapt-get purge 与 apt-get remove是不同的&#xff0c;简单来说&#xff1a; purge可以将包以及软件的配置文件全部删除 remove仅可以删除包&#xff0c;但不…

springcloud基本使用(搭建eureka服务端)

创建springbootmaven项目 next next finish创建成功 删除项目下所有文件目录&#xff0c;只保留pox.xml文件 父项目中的依赖&#xff1a; springboot依赖&#xff1a; <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-s…

类模板与友元

掌握类模板配合友元函数的类内实现和类外实现。 全局函数类内实现&#xff1a;直接在类内声明友元函数即可&#xff08;推荐使用这种&#xff09; #include <iostream> #include <Windows.h> #include <string>using namespace std;template<typename T…

大模型提示工程之Prompt框架和示例

今天和大家分享一下&#xff1a;大模型提示工程之Prompt框架和示例&#xff1a; TAG框架 任务&#xff08;Task&#xff09;: 开发一个新的手机应用&#xff0c;旨在帮助用户更好地管理他们的日常健康。 行动&#xff08;Action&#xff09;: 进行市场调研&#xff0c;设计用户…

[Godot] 3D拾取

CollisionObject3D文档 Camera3D文档 CollisionObject3D有个信号_input_event&#xff0c;可以用于处理3D拾取。 Camera3D也有project_position用于将屏幕空间坐标投影到3D空间。 extends Node3D#是否处于选中状态 var selected : bool false #摄像机的前向量 var front : V…

Swift:“逻辑运算子“与“比较运算符“

1. 逻辑非 ! 逻辑非运算符 ! 是用于对布尔值取反的。当操作数为 true 时&#xff0c;! 将返回 false&#xff0c;而当操作数为 false 时&#xff0c;! 将返回 true。 let isTrue true let isFalse !isTrue // isFalse 现在是 false 2. 逻辑与 && 逻辑与运算符 &a…