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方法
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 详解linux中rsync的妙用[通俗易懂]

    详解linux中rsync的妙用[通俗易懂]????1.rsync备份服务器软件介绍:Rsync是一款开源的、快速的、多功能的、可实现全量及增长的本地或远程数据同步备份的优秀工具。增量备份:只同步变化的数据细腻些,主要利用了quickcheck算法实现同步原理:1)建立好网络连接2)先进行数据信息对比3)只将变化的数据进行增量备份2.rsync软件作用说明:(1v4cp/scp/rm/ls)本地数据备份:cp[root@backup~]#cp-a/etc/hosts/tmp/hosts_cp[root@backu

    2022年10月13日
  • dainying

    dainyingmagnet:?xt=urn:btih:DB334CEAFC75A4045D5958159D972B1CCEC1C590

  • 微信公众平台 获取用户openid

    微信公众平台 获取用户openid今天做微信公众号获取用户的openid,圆满成功,特此来一发。 第一步:理解逻辑。 1:获取openid的逻辑获得微信的openid,需要先访问微信提供的一个网址:这个网址名为url1,下面有赋值。通过这个网址,微信用来识别appid信息,在这个网址中,有一个属性redirect_uri,是微识别完appid后,进行跳转的操作,可以是网页,也可以是servlet,我这里用的是…

  • 【JAVA基础教程】java中异常机制总结

    【JAVA基础教程】java中异常机制总结

  • 重新认识KCP_重新认识一个人的说说

    重新认识KCP_重新认识一个人的说说什么是KCP"KCP"是一种网络传输协议(AFastandReliableARQProtocol),可以视它为TCP的代替品,但是它运行于用户空间,它不管底层的发送与

  • android 扫码二维码_安卓手机二维码扫描器

    android 扫码二维码_安卓手机二维码扫描器最近公司项目App中要集成二维码扫描来适应在户外工作的时候,对码头集装箱等上面贴的A4纸张打印的二维码进行识别,一般App二维码集成后,能扫出来就不管了,但是我们在集成成功后,根据用户反馈,在户外的环境下,很多二维码识别不了,或者识别速度慢,我们自己也是适用了一下,发现也确实是这样. 一般造成这个识别不出来的原因,我们总结了以下几点:A4纸张打印的标签二维码,本来打印就不是特别清晰,…

    2022年10月27日

发表回复

您的电子邮箱地址不会被公开。

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