❝本文已被Github仓库收录 https://github.com/silently9527/JavaCore
❞
前言
最近工作中接到一个需求,需要对接第三方公司的API接口,由于每个公司提供的数据格式都不一样以及后期可能会对接更多的公司,我们给出的技术方式是设计一个数据解析模块,把数据结构各异的解析成我们内部定义的通用数据对象,如果后期再新增第三方公司的接口,我们只需要在后台配置好数据的解析规则即可完成对接
我们调研过表达式语言OGNL、SpEL(表达式语言不止这两种),由于考虑到我们项目本身都是依赖于Spring的,所以选择了SpEL
SpEL介绍以及功能概述
SpEL是spring提供的强大的表达式语言,本身也是作为了Spring的基石模块,在Spring的很多模块中都是使用到;虽然SpEL是Spring的基石,但是完全脱离Spring独立使用。SpEL提供的主要功能:
文字表达式
布尔和关系运算符
正则表达式
类表达式
访问 properties, arrays, lists, maps
方法调用
关系运算符
参数
调用构造函数
Bean引用
构造Array
内嵌lists、内嵌maps
三元运算符
变量
用户定义的函数
集合投影
集合筛选
模板表达式
SpEL表达语言初级体验
下面的代码使用SpEL API来解析文本字符串表达式 Hello World.
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("'Hello World'");
String message = (String) exp.getValue();
接口ExpressionParser
负责解析表达式字符串,在表达式中表示字符串需要使用单引号
SpEL支持很多功能特性,如调用方法,访问属性,调用构造函数。
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("'Hello World'.concat('!')");
String message = (String) exp.getValue();
SpEL还支持使用标准的“.”符号,即嵌套属性prop1.prop2.prop3和属性值的设置
ExpressionParser parser = new SpelExpressionParser();
// invokes getBytes().length
Expression exp = parser.parseExpression("'Hello World'.bytes.length");
int length = (Integer) exp.getValue();
也可以使用public <T> T getValue(Class<T> desiredResultType)
来获取返回指定类型的结果,不用强制类型转换,如果实际的结果不能转换成指定的类型就会抛出异常EvaluationException
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("new String('hello world').toUpperCase()");
String message = exp.getValue(String.class);
SpEL比较常见的用途是针对一个特定的对象实例(称为root object)提供被解析的表达式字符串. 这种方式也是我们项目中使用的方式,把不同渠道传入的json数据