spel表达式的用法_el表达式判断是否为空

spel表达式的用法_el表达式判断是否为空spel表达式运算使用翻看公司代码,这一块不是很懂,查资料,记一下,还是太菜1.常用的对象Expression:表达式对象SpelExpressionParser:表达式解析器EvaluationContext:上下文2.使用本文参考了下面的几篇文章https://www.cnblogs.com/shihuc/p/9338173.htmlhttps://blog.csdn.net/f641385712/article/details/90812967下面的例子主要是来源于第一

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

spel表达式运算使用

翻看公司代码,这一块不是很懂,查资料,记一下,还是太菜

1. 常用的对象

  • Expression: 表达式对象
  • SpelExpressionParser:表达式解析器
  • EvaluationContext:上下文

2. 使用

本文参考了下面的几篇文章

public class AccessingPropertiesApplication { 
   
    static Logger logger = Logger.getLogger(AccessingPropertiesApplication.class);
    public static void main(String []args) { 
   
        ExpressionParser parser = new SpelExpressionParser();
        //a. 调用String这个javaBean的'getBytes()'
        Expression exp = parser.parseExpression("'Hello World'.bytes");
        byte[] bytes = (byte[]) exp.getValue();
        logger.info("字节内容:"+ bytes);

        //b.嵌套的bean实例方法调用,通过'.'运算符
        exp = parser.parseExpression("'Hello World'.bytes.length");
        int len = (Integer) exp.getValue();
        logger.info("字节长度:" + len);

        //c. property訪問
        GregorianCalendar c = new GregorianCalendar();
        c.set(1856, 7, 9);
        //Inventor的构造函数参数分别是:name, birthday, and nationality.
        Inventor tesla = new Inventor("Nikola Tesla", c.getTime(), "Serbian");
        parser = new SpelExpressionParser();
        exp = parser.parseExpression("name");
        EvaluationContext context = new StandardEvaluationContext(tesla);
        String name = (String) exp.getValue(context);
        logger.info("Inventor: " + name);

        //对对象实例的成员进行操作。 evals to 1856, 注意纪年中,起点是从1900开始。
        int year = (Integer) parser.parseExpression("Birthdate.Year + 1900").getValue(context);
        //Inventor tesla设置出生地(瞎写的信息)。
        tesla.setPlaceOfBirth(new PlaceOfBirth("America city", "America"));
        String city = (String) parser.parseExpression("placeOfBirth.City").getValue(context);
        logger.info("year: " + year + ", city: " + city);

        //d. array, list操作
        // 先测试验证array
        tesla.setInventions(new String []{ 
   "交流点","交流电发电机","交流电变压器","变形记里面的缩小器"});
        EvaluationContext teslaContext = new StandardEvaluationContext(tesla);
        String invention = parser.parseExpression("inventions[3]").getValue(teslaContext, String.class);
        logger.info("Array: " + invention);
        //list测试验证
        Society society = new Society();
        society.addMember(tesla);
        StandardEvaluationContext societyContext = new StandardEvaluationContext(society);
        // evaluates to "Nikola Tesla"
        String mName = parser.parseExpression("Members[0].Name").getValue(societyContext, String.class);
        // List and Array navigation
        // evaluates to "Wireless communication"
        String mInvention = parser.parseExpression("Members[0].Inventions[2]").getValue(societyContext, String.class);
        logger.info("List: mName= " + mName + ", mInvention= " + mInvention);

        //e. Map的操作
        //首先构建数据环境
        GregorianCalendar cm = new GregorianCalendar();
        cm.set(1806, 7, 9);
        Inventor idv = new Inventor("Idovr", cm.getTime(), "China,haha");
        Society soc = new Society();
        idv.setPlaceOfBirth(new PlaceOfBirth("Wuhan","China"));
        soc.addOfficer(Advisors, idv);
        soc.addOfficer(President, tesla);
        EvaluationContext socCtxt = new StandardEvaluationContext(soc);
        Inventor pupin = parser.parseExpression("Officers['president']").getValue(socCtxt, Inventor.class);
        String mCity = parser.parseExpression("Officers['president'].PlaceOfBirth.City").getValue(socCtxt, String.class);
        logger.info("Map case 1: " + mCity);
        // setting values
        Expression mExp = parser.parseExpression("Officers['advisors'].PlaceOfBirth.Country");
        mExp.setValue(socCtxt, "Croatia");
        //下面注释掉的,是官方的做法,这个是有问题的,基于我的研究环境
        //parser.parseExpression("Officers['advisors'][0].PlaceOfBirth.Country").setValue(socCtxt, "Croatia");
        //String country = parser.parseExpression("Officers['advisors'][0].PlaceOfBirth.Country").getValue(socCtxt, String.class);
        String country = mExp.getValue(socCtxt, String.class);
        logger.info("Map case 2: " + country);
    }
}

3. 我自己的例子

  • 实体类
package com;

import lombok.Data;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;

@Data
public class A{ 
   
    private Integer id ;
    private String name ;
    private String ccc ;
    List<String> lists = new ArrayList<>(10);

    public A(Integer id, String name, String ccc) { 
   
        this.id = id;
        this.name = name;
        this.ccc = ccc;
        IntStream.range(0,10).forEach(t->lists.add(String.valueOf(t)));
    }
    @Override
    public String toString() { 
   
        return "A{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", list=" + ccc +
                '}';
    }
}
  • 校验类
   Expression  exp = null;
        SpelExpressionParser parser = null;
        A tesla = new A(1, "aaa","ccc");
        parser = new SpelExpressionParser();
        //属性名.方法或者属性
        exp = parser.parseExpression("lists.size() > 0");
        EvaluationContext context = new StandardEvaluationContext(tesla);
        /** * 这个 context 是上下文。 * getValue(第一个是 context ,第二个是想要返回的值)这个值是可要可不要的. 不指定类型的话返回的就是 object了 */
        Boolean value = exp.getValue(context, Boolean.class);
        int year = (Integer) parser.parseExpression("id + 1900").getValue(context);
        logger.info("year,{}",year);
        logger.info("Inventor: " + value);

记一次错误

  • 报错信息为:
    maybe not public or not valid
  • 解决方式
    添加get和set方法
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197325.html原文链接:https://javaforall.net

(0)
上一篇 2025年9月6日 上午8:22
下一篇 2025年9月6日 上午9:01


相关推荐

  • 书单丨压箱底儿的10本传世计算机经典著作

    书单丨压箱底儿的10本传世计算机经典著作什么是传世经典 即便经受了几十年的风霜 大师的智慧之光依然指引着你通往技术殿堂 你没理由还在原地踏步 从这 10 本传世之作开始迎头赶上吧 本期书单 1 C Primer 中文版 第 5 版 2 程序员修炼之道 通向务实的最高境界 第 2 版 3 深入浅出数据分析 4 架构整洁之道 5 高性能 MySQL 第 3 版 6 编码 隐匿在计算机软硬件背后的语言 7 EffectiveC 改善程序与设计的 55 个具体做法 第 3 版中文版 8 UNIX 编程艺术 9 强化学习 第 2 版

    2026年3月17日
    1
  • 求两个向量的夹角_数量积和向量积的公式

    求两个向量的夹角_数量积和向量积的公式如图所示,我们要计算任意两个向量之间的夹角。(图中的坐标数字是估计值,随手给定)python代码如下importmathAB=[1,-3,5,-1]CD=[4,1,4.5,4.5]EF=[2,5,-2,6]PQ=[-3,-4,1,-6]defangle(v1,v2):dx1=v1[2]-v1[0]dy1=v1[3]-v1[1]dx2=v2[2]-v2[…

    2026年3月12日
    2
  • 【Python windows11修改器 】——制作一个简易的修改器,修改windwos11右键和一些小功能

    【Python windows11修改器 】——制作一个简易的修改器,修改windwos11右键和一些小功能快五一了 在这里祝大家五一快乐 顺便供上一块免费且好用的 windows11 修改器点个赞留个关注吧 现在应该大部分人都使用 win11 系统吧 不用也要强行给你更新到 win11 win11 其实挺好用哈 只是有一点不好用 就是右键的菜单 今天做个小程序 就是应该修改 win11 的一个应用程序先来看一段视频哈 windows11 修改器提取码 phu3 源代码加编译后的文件提取码 7fl1 该程序的安装包已被博主做成了安装包这款软件纯 python 制作 内容简单 1

    2026年3月18日
    2
  • java三元运算符用法

    java三元运算符用法由 符号表示的 具体的含义其实就和 if else 结构的含义差不多 这种运算符会将某个条件作两种处理 如果满足条件的话就执行第一个结果 如果不满足的话就执行另外一个结果 例如 IntA B C A 2 B 3 C A gt B 100 200 这条语句的意思是 如果 A gt B 的话 就将 100 赋给 C 否则就将 200 赋给 C 一 比较运算符又叫关系运算符 用于判断两个被操作数的大小及是否相等的关系 使用比较运算符其返回结果一定为布尔值 运算符

    2026年3月26日
    2
  • python开发环境搭建、pycharm安装matplotlib、numpy等包方法

    python开发环境搭建、pycharm安装matplotlib、numpy等包方法之前电脑上已经安装 pycharm 编辑器 这是个很强大的 python 开发编辑工具 除了写代码外 集成了环境切换 安装各类应用包 项目建设等功能 一 pycharm 中 run pythonconsol 和 terminal 区别 run 窗口是平时编辑代码运行后的输入输出台 提供用户输入 运行结果显示 报出异常等功能 pythonconsol 是 python 交互式编辑运行窗口 用户通过编辑每行代码 自动输出结果 如果含 print 语句的话 对于现阶段的我来说应该没有什么用 term

    2026年3月27日
    3
  • 88核+1.2TB/s带宽:英伟达首发智能体AI处理器Vera

    88核+1.2TB/s带宽:英伟达首发智能体AI处理器Vera

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号