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

 更新时间:2024年03月06日 11:12:44   作者:师小师  
在 Spring Boot 中,我们可以使用字符串替换工具类来实现这些功能,本文主要介绍了SpringBoot引入SPEL模板字符串替换的两种方式,具有一定的参考价值,感兴趣的可以了解一下

Spring 表达式语言 (SpEL)

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

模板占位符 替换 {$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;
        }

        @Override
        public 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 方式:模板字符转替换 ${}

添加依赖

<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>

测试

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));
    }
}

到此这篇关于SpringBoot引入SPEL模板字符串替换的两种方式的文章就介绍到这了,更多相关SpringBoot SPEL字符串替换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

 

相关文章

  • 浅析如何在SpringBoot中实现数据脱敏

    浅析如何在SpringBoot中实现数据脱敏

    脱敏是指在不改变原数据结构的前提下,通过某种方式处理数据,使数据不能直接暴露用户的真实信息,下面我们就来看看SpringBoot中实现数据脱敏的具体方法吧
    2024-03-03
  • JavaEE开发基于Eclipse的环境搭建以及Maven Web App的创建

    JavaEE开发基于Eclipse的环境搭建以及Maven Web App的创建

    本文主要介绍了如何在Eclipse中创建的Maven Project,本文是JavaEE开发的开篇,也是基础。下面内容主要包括了JDK1.8的安装、JavaEE版本的Eclipse的安装、Maven的安装、Tomcat 9.0的配置、Eclipse上的M2Eclipse插件以及STS插件的安装。
    2017-03-03
  • SpringCloud消息总线Bus配置中心实现过程解析

    SpringCloud消息总线Bus配置中心实现过程解析

    这篇文章主要介绍了SpringCloud消息总线Bus配置中心实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • JAVA面试题 从源码角度分析StringBuffer和StringBuilder的区别

    JAVA面试题 从源码角度分析StringBuffer和StringBuilder的区别

    这篇文章主要介绍了JAVA面试题 从源码角度分析StringBuffer和StringBuilder的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面我们来一起学习下吧
    2019-07-07
  • JDK14性能管理工具之Jconsole的使用详解

    JDK14性能管理工具之Jconsole的使用详解

    JConsole是JDK自带的管理工具,在JAVA_HOME/bin下面,直接命令JConsole即可开启JConsole。接下来通过本文给大家分享JDK14性能管理工具之Jconsole的使用,感兴趣的朋友一起看看吧
    2020-05-05
  • Java编程中应用的GUI设计基础

    Java编程中应用的GUI设计基础

    这篇文章主要介绍了Java编程中应用的GUI设计基础,为一些Java开发CS类型应用的基础概念知识,需要的朋友可以参考下
    2015-10-10
  • 基于Integer值判断是否相等的问题

    基于Integer值判断是否相等的问题

    这篇文章主要介绍了基于Integer值判断是否相等的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Java1.7全网最深入HashMap源码解析

    Java1.7全网最深入HashMap源码解析

    HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 nul
    2021-11-11
  • 基于synchronized修饰静态和非静态方法

    基于synchronized修饰静态和非静态方法

    这篇文章主要介绍了基于synchronized修饰静态和非静态方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • java 工厂模式的实例详解

    java 工厂模式的实例详解

    这篇文章主要介绍了java 工厂模式的实例详解的相关资料,这里举例说明该如何实现工厂模式,需要的朋友可以参考下
    2017-09-09

最新评论