SpringBoot 引入 SPEL 模板字符串替换的两种方式

Spring 表达式语言 (SpEL)

官方文档:https://docs.spring.io/spring-framework/docs/6.0.x/reference/html/core.html#expressions

文章目录

    • Spring 表达式语言 (SpEL)
      • 模板占位符 替换 {$name}
      • common-text 方式:模板字符转替换 ${}

模板占位符 替换 {$name}

import org.springframework.context.expression.MapAccessor;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.util.PropertyPlaceholderHelper;import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;
/*** 内容占位符 替换* <p>* 模板占位符格式{$name}*/
public class ContentHolderUtil {/*** 占位符前缀*/private static final String PLACE_HOLDER_PREFIX = "{$";/*** 占位符后缀*/private static final String PLACE_HOLDER_SUFFIX = "}";private static final StandardEvaluationContext EVALUATION_CONTEXT;private static final PropertyPlaceholderHelper PROPERTY_PLACEHOLDER_HELPER = new PropertyPlaceholderHelper(PLACE_HOLDER_PREFIX, PLACE_HOLDER_SUFFIX);static {EVALUATION_CONTEXT = new StandardEvaluationContext();EVALUATION_CONTEXT.addPropertyAccessor(new MapAccessor());}public static String replacePlaceHolder(final String template, final Map<String, String> paramMap) {String replacedPushContent = PROPERTY_PLACEHOLDER_HELPER.replacePlaceholders(template,new CustomPlaceholderResolver(template, paramMap));return replacedPushContent;}private static class CustomPlaceholderResolver implements PropertyPlaceholderHelper.PlaceholderResolver {private final String template;private final Map<String, String> paramMap;public CustomPlaceholderResolver(String template, Map<String, String> paramMap) {super();this.template = template;this.paramMap = paramMap;}@Overridepublic String resolvePlaceholder(String placeholderName) {String value = paramMap.get(placeholderName);if (null == value) {String errorStr = MessageFormat.format("template:{0} require param:{1},but not exist! paramMap:{2}",template, placeholderName, paramMap.toString());throw new IllegalArgumentException(errorStr);}return value;}}public static void main(String[] args) {Map<String,String> map = new HashMap<>();map.put("name","张三");map.put("age","12");// 注意:{$}内不能有空格final String s = replacePlaceHolder("我叫 {$name}, 我今年 {$age} 岁了。", map);System.out.println(s);}
}

common-text 方式:模板字符转替换 ${}

  1. 添加依赖

    <dependency><groupId>org.apache.commons</groupId><artifactId>commons-text</artifactId><version>1.10.0</version>
    </dependency><!-- lombok -->
    <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
    </dependency>
    
  2. 测试

    import lombok.extern.slf4j.Slf4j;
    import org.apache.commons.text.StringSubstitutor;
    import org.springframework.util.CollectionUtils;
    import org.springframework.util.StringUtils;import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.stream.Collectors;@Slf4j
    public class CommonTextUtil {// 占位符前缀private static final String prefix = "${";// 占位符后缀private static final String suffix = "}";/** commons-text* */public static String replaceVar(Map<String, Object> vars, String template) {if (!StringUtils.hasLength(template)) {log.info(String.format("调用%s方法失败,模板字符串替换失败,模板字符串不能为空",Thread.currentThread().getStackTrace()[1].getMethodName()));return null;}if (CollectionUtils.isEmpty(vars)) {log.info(String.format("调用%s方法失败,模板字符串替换失败,map不能为空",Thread.currentThread().getStackTrace()[1].getMethodName()));return null;}List<String> tempStrs = vars.keySet().stream().map(s -> prefix + s + suffix).collect(Collectors.toList());tempStrs.forEach(t -> {if (!template.contains(t)) {throw new RuntimeException(String.format("调用%s方法失败,模板字符串替换失败,map的key必须存在于模板字符串中",Thread.currentThread().getStackTrace()[1].getMethodName()));}});StringSubstitutor stringSubstitutor = new StringSubstitutor(vars);return stringSubstitutor.replace(template);}public static void main(String[] args) {/** 错误的场景:比如${变量},{}内不能含有空格等等* System.out.println(replaceVar(vals, "我叫${ name},今年${age }岁."));* System.out.println(replaceVar(new HashMap<>(), temp));* System.out.println(replaceVar(vals, "我叫张三"));* System.out.println(replaceVar(vals, "我叫${name},今年${age1}岁."));* */Map<String, Object> vals = new HashMap<>();vals.put("name", "张三");vals.put("age", "20");String temp = "我叫${name},今年${age}岁.";System.out.println(replaceVar(vals, temp));}
    }
    

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

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

相关文章

「Mybatis实战九」:Mybatis的dao层开发使用 - 代理开发方式

一、前言 ​ 本文将进一步探讨在之前“「Mybatis实战八」&#xff1a;传统开发方式下的Mybatis DAO层构建”所奠定的基础之上&#xff0c;如何运用Mybatis的接口代理开发模式来优化持久层的设计与实现&#xff0c;解决上文中的问题。 二、代理开发方式简介 Mybatis提供的基于…

PCIE的BAR空间

1.PCIe 简介 PCIe&#xff08;Peripheral Component Interconnect Express&#xff09;是一种高速 串行计算机扩展总线标准&#xff0c;主要用于连接主板上的中央处理器&#xff08;CPU&#xff09;和 各种外部设备&#xff0c;如显卡、声卡、硬盘等。PCIe 总线取代了传统的 PC…

前端部署真的不简单

公众号&#xff1a;程序员白特&#xff0c;欢迎一起交流学习~> 原文&#xff1a;前端部署真的不简单 - 掘金 (juejin.cn) 现在大部分的中小型公司部署前端代码都是比较简单的&#xff0c;主要步骤如下: 首先&#xff0c;通过脚手架提供的命令npm run build打包前端代码&…

SwiftUI中background的设置与应用

在SwiftUI中&#xff0c;background是一种用于设置视图背景的修饰符。它可以应用于任何视图&#xff0c;包括容器视图、文本视图和图像视图等。 要设置一个视图的背景&#xff0c;你可以在其后面添加一个.background修饰符&#xff0c;并指定一个颜色、渐变、图像或其他视图作…

MySQL Explain关键字:语法和输出格式

MySQL Explain关键字&#xff1a;语法和输出格式 语法结构如下&#xff1a; {EXPLAIN | DESCRIBE | DESC}tbl_name [col_name | wild]{EXPLAIN | DESCRIBE | DESC}[explain_type]{explainable_stmt | FOR CONNECTION connection_id}{EXPLAIN | DESCRIBE | DESC} ANALYZE [FOR…

【模型复现】自制数据集上复现目标检测域自适应 SSDA-YOLO

【模型复现】自制数据集上复现目标检测域自适应 SSDA-YOLO 1. 环境安装2. 数据集制作2.1 数据准备2.2 数据结构 3. 模型训练3.1 数据文件配置3.2 训练超参数配置3.3 模型训练 4. 模型验证4.1 验证超参数配置4.2 模型验证 5. 模型推理5.1 推理超参数配置5.2 模型推理 6. 踩坑记录…

【主题广范|见刊快】2024年可再生能源与智能电网国际学术会议(ICRESG 2024)

【主题广范|见刊快】2024年可再生能源与智能电网国际学术会议(ICRESG 2024) 2024 International Conference Renewable Energy and Smart Grid 本次会议汇聚了来自全球各地的专家学者&#xff0c;共同探讨可再生能源与智能电网领域的最新研究成果、技术进展和未来发展趋势。会…

数据结构.多项式加法

#include<iostream> using namespace std; int a[100][2], b[100][2], sum[100][2]; int n, m; int main() {cin >> n;//输入第一个多项式的项数for (int i 0; i < n; i){cin >> a[i][0] >> a[i][1];//分别输入系数和指数}cin >> m;//输入第…

递归学习资料

思路 例题 package 递归;public class 反向打印字符串 {public static void main(String[] args) {f("ABC",0);}static void f(String str,int n){if (nstr.length()){return;}f(str,n1);System.out.println(str.charAt(n)"");} }多路递归 递归优化 -剪枝…

建立网络防御时需要重点考虑的10个因素

互联网安全中心&#xff08;CIS&#xff09;建议企业可以从以下10个因素入手&#xff1a;资产管理、数据管理、安全配置、账户和访问控制管理、漏洞管理、日志管理、恶意软件防御、数据恢复、安全培训和事件响应。 1、资产管理 建立网络防御的第一步是制定企业资产和软件资产的…

【场景题】如何设计一个购物车功能?

本文参考文章&#xff1a;https://www.hollischuang.com/archives/6998 https://www.woshipm.com/pd/4115447.html https://zq99299.github.io/note-book/back-end-storage/01/03.html 首先我们要明白&#xff1a;购物车系统在电商系统中的角色是作为用户选购商品和最终下单的桥…

AI推介-大语言模型LLMs论文速览(arXiv方向):2024.02.25-2024.03.01

论文目录~ 1.Arithmetic Control of LLMs for Diverse User Preferences: Directional Preference Alignment with Multi-Objective Rewards2.Keeping LLMs Aligned After Fine-tuning: The Crucial Role of Prompt Templates3.Meta-Task Prompting Elicits Embedding from Lar…

【Python】音频合并与切分——采用moviepy包实现

注&#xff1a;moviepy包也可以进行视频的合并和切分&#xff0c;暂时没有需求&#xff0c;所以不予实现。 如果觉得好用&#xff0c;请不要吝啬你的点赞哟~ 另外&#xff0c;如果有其他需求&#xff0c;欢迎私信我&#xff0c;有条件的话&#xff0c;我会尽可能实现。 # 内容描…

AI Icon Generator:免费的AI图标生成器,一键生成你想要的图标(附试用链接)

给大家推荐一个免费的AI图标生成器&#xff0c;只需要输入你想要生成的图标内容就可以一键生成图标&#xff0c;可以选择不同风格&#xff0c;完全免费&#xff0c;比如输入“一只在宇宙飞船上的猪&#xff01;”看看他能生成什么样的效果。 感兴趣的小伙伴快去试试吧&#xff…

一本通1225--金银岛--贪心算法

题目描述 某天KID利用飞行器飞到了一个金银岛上&#xff0c;上面有许多珍贵的金属&#xff0c;KID虽然更喜欢各种宝石的艺术品&#xff0c;可是也不拒绝这样珍贵的金属。但是他只带着一个口袋&#xff0c;口袋至多只能装重量为w的物品。岛上金属有s个种类, 每种金属重量不同&a…

外贸网站做Google SEO 用wordpress模板的优势

易于优化&#xff1a;WordPress模板是专门为搜索引擎优化(SEO)设计的。从一开始&#xff0c;WordPress模板就考虑到了搜索引擎的因素&#xff0c;因此在构建网站时已经考虑了如何优化网站的结构和内容。使用WordPress模板可以简化优化过程&#xff0c;让您的网站更容易被搜索引…

C语言-两数组元素互换

#include <stdio.h> #include <string.h>//两数组元素互换 void swap(int ch1[],int ch2[],int sz) {int i 0;char ch 0;for(i 0;i < sz;i){ch ch1[i];ch1[i] ch2[i];ch2[i] ch;} } //打印数组元素 void print(int ch[],int sz) {int i 0;for(i 0;i <…

uniapp iOS 真机调试

一、下载爱思助手 二、打开爱思助手&#xff0c;把你的 苹果手机 用原装数据线连接至电脑&#xff1a; 找到 工具箱 > 搜索IPA > 打开IAP签名 三、添加 IPA 文件 mac&#xff1a;finder 》应用程序 》右键 HbuilderX 》显示包内容 》HbuilderX / plugins/ lau…

矩阵爆破逆向-条件断点的妙用

不知道你是否使用过IDA的条件断点呢&#xff1f;在IDA进阶使用中&#xff0c;它的很多功能都有大作用&#xff0c;比如&#xff1a;ida-trace来跟踪调用流程。同时IDA的断点功能也十分强大&#xff0c;配合IDA-python的输出语句能够大杀特杀&#xff01; 那么本文就介绍一下这…

基于chatgpt的聊天机器人

基于chatgpt的聊天机器人 以下是一个基于Python的示例代码&#xff0c;展示如何在本地环境中使用预训练的ChatGPT模型构建一个简单的聊天机器人应用程序。在这个示例中&#xff0c;我们将使用Hugging Face Transformers库加载GPT-2模型&#xff0c;并创建一个基于命令行的用户…