Español

Spring framework 5 : Spring Expression Language SpEL


Spring expression language (SpEL) es un lenguaje de expresiones que permite realizar operaciones sobre la información en tiempo de ejecución, en el post anterior se utilizó para leer información de un archivo .properties, en este post hablaremos más sobre expression language en detalle.

Los operadores disponibles en SpEL son los siguientes:

Operadores aritmeticos+, -, *, /, %, ^, div, mod
Relacionales <, >, ==, !=, <=, >=, lt, gt, eq, ne, le, ge
Lógicosand, or, not, &&, ||, !
Condicionales?:
Expresiones regularesMatchers

A continuación mostraremos como utilizarlos en una aplicación de spring.

SpelExpressionParser

Antes de iniciar, el primer paso será aprender a utilizar la clase SpelExpressionParser la cual nos permite evaluar expresiones sin necesidad de iniciar el contexto de Spring framework, a continuación se muestra como crearlo:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;

/**
 * @author raidentrance
 *
 */
public class SpelExpressionApplication {

	private static final Logger log = LoggerFactory.getLogger(SpelExpressionApplication.class);

	public static void main(String[] args) {
		ExpressionParser expressionParser = new SpelExpressionParser();
		Expression expression = expressionParser.parseExpression("'Hi from devs4j'");
		log.info("String expression {}",expression.getValue());
		
	}
}

Analizando el código anterior podemos ver lo siguiente :

  • SpelExpressionParser nos permite evaluar expresiones de spring SpEL
  • El método Expression parseExpression(String expression) recibe como parámetro una expresión de spring y devuelve un objeto de tipo Expression.
  • La clase Expression contiene un método llamado Object getValue() el cuál devuelve el resultado de la expresión.

Ejemplos básicos de expresiones

Una vez que entendimos como evaluar expresiones SpEL, el siguiente paso será ver algunos ejemplos:

Uso de Strings

public static void main(String[] args) {
	ExpressionParser expressionParser = new SpelExpressionParser();
	Expression expression = expressionParser.parseExpression("'Hi'.concat('from devs4j')");
	log.info("Concat expression {}", expression.getValue());
	expression = expressionParser.parseExpression("'Hi from devs4j'.toUpperCase()");
	log.info("To upper case expression {}", expression.getValue());
	expression = expressionParser.parseExpression("'Hi from devs4j'.length()");
	log.info("Get length expression {}", expression.getValue());

}

La expresión anterior concatena los Strings “Hi” y “from devs4j” al ejecutarlo el resultado será:

11:05:36.022 [main] INFO com.devs4j.spel.SpelExpressionApplication - Concat expression Hifrom devs4j
11:05:36.026 [main] INFO com.devs4j.spel.SpelExpressionApplication - To upper case expression HI FROM DEVS4J
11:05:36.026 [main] INFO com.devs4j.spel.SpelExpressionApplication - Get length expression 14

Operadores aritméticos

private static final Logger log = LoggerFactory.getLogger(SpelExpressionApplication.class);

public static void main(String[] args) {
	ExpressionParser expressionParser = new SpelExpressionParser();
	Expression expression = expressionParser.parseExpression("10 + 20");
	log.info("Arithmetic expression {}", expression.getValue());

	expression = expressionParser.parseExpression("10 - 20");
	log.info("Arithmetic expression {}", expression.getValue());

	expression = expressionParser.parseExpression("10 * 20");
	log.info("Arithmetic expression {}", expression.getValue());

	expression = expressionParser.parseExpression("20 / 10");
	log.info("Arithmetic expression {}", expression.getValue());

	expression = expressionParser.parseExpression("20 mod 10");
	log.info("Arithmetic expression {}", expression.getValue());

	expression = expressionParser.parseExpression("2 ^ 3");
	log.info("Arithmetic expression {}", expression.getValue());

	expression = expressionParser.parseExpression("(2 ^ 3) * 2 + 24");
	log.info("Arithmetic expression {}", expression.getValue());

}

La salida del código anterior sería:

11:17:42.464 [main] INFO com.devs4j.spel.SpelExpressionApplication - Arithmetic expression 30
11:17:42.468 [main] INFO com.devs4j.spel.SpelExpressionApplication - Arithmetic expression -10
11:17:42.469 [main] INFO com.devs4j.spel.SpelExpressionApplication - Arithmetic expression 200
11:17:42.469 [main] INFO com.devs4j.spel.SpelExpressionApplication - Arithmetic expression 2
11:17:42.470 [main] INFO com.devs4j.spel.SpelExpressionApplication - Arithmetic expression 0
11:17:42.470 [main] INFO com.devs4j.spel.SpelExpressionApplication - Arithmetic expression 8
11:17:42.470 [main] INFO com.devs4j.spel.SpelExpressionApplication - Arithmetic expression 40

Operadores relacionales

public static void main(String[] args) {
	ExpressionParser expressionParser = new SpelExpressionParser();
	Expression expression = expressionParser.parseExpression("10 < 20");
	log.info("Relational expression {}", expression.getValue());

	expression = expressionParser.parseExpression("10 > 20");
	log.info("Relational expression {}", expression.getValue());

	expression = expressionParser.parseExpression("10 == 20");
	log.info("Relational expression {}", expression.getValue());

	expression = expressionParser.parseExpression("10 != 20");
	log.info("Relational expression {}", expression.getValue());

}

Salida del código anterior:

11:19:59.557 [main] INFO com.devs4j.spel.SpelExpressionApplication - Relational expression true
11:19:59.561 [main] INFO com.devs4j.spel.SpelExpressionApplication - Relational expression false
11:19:59.562 [main] INFO com.devs4j.spel.SpelExpressionApplication - Relational expression false
11:19:59.562 [main] INFO com.devs4j.spel.SpelExpressionApplication - Relational expression true

Operadores lógicos

public static void main(String[] args) {
	ExpressionParser expressionParser = new SpelExpressionParser();
	Expression expression = expressionParser.parseExpression("100 > 20 && 100 < 10000");
	log.info("Relational expression {}", expression.getValue());

	expression = expressionParser.parseExpression("100 < 20 || 100 < 10000");
	log.info("Relational expression {}", expression.getValue());

	expression = expressionParser.parseExpression("!(100 < 20) ");
	log.info("Relational expression {}", expression.getValue());
}

Salida:

11:22:29.569 [main] INFO com.devs4j.spel.SpelExpressionApplication - Relational expression true
11:22:29.573 [main] INFO com.devs4j.spel.SpelExpressionApplication - Relational expression true
11:22:29.573 [main] INFO com.devs4j.spel.SpelExpressionApplication - Relational expression true

Operadores condicionales

private static final Logger log = LoggerFactory.getLogger(SpelExpressionApplication.class);

public static void main(String[] args) {
	ExpressionParser expressionParser = new SpelExpressionParser();
	Expression expression = expressionParser.parseExpression("(10 ==20) ? 'Hi':'Adios'");
	log.info("Conditional expression {}", expression.getValue());
}

Salida:

11:24:44.866 [main] INFO com.devs4j.spel.SpelExpressionApplication - Relational expression Adios

Uso de expresiones regulares en SpEL

Veamos el siguiente modelo:

class User {
	private String username;
	private String password;

	public User(String username, String password) {
		this.username = username;
		this.password = password;
	}

	// Getters y setters
}
public static void main(String[] args) {

	User user = new User("raidentrance", "devs4jRules");
	
	ExpressionParser expressionParser = new SpelExpressionParser();
	Expression expression = expressionParser.parseExpression("username matches '[a-zA-Z]+'");
	log.info("Regex expression {}", expression.getValue(user));
	
	expression = expressionParser.parseExpression("password matches '[a-zA-Z]+'");
	log.info("Regex expression {}", expression.getValue(user));
}

Salida:

11:37:49.944 [main] INFO com.devs4j.spel.SpelExpressionApplication - Regex expression true
11:37:49.947 [main] INFO com.devs4j.spel.SpelExpressionApplication - Regex expression false

Estos son solo algunos ejemplos sobre el uso de Expression language en Spring, cabe aclarar que es posible utilizarlo también con la anotación @Value(String value) lo cual lo hace un lenguaje muy poderoso y fácil de utilizar en Spring.

Para estar al pendiente sobre nuestro contenido nuevo síguenos en nuestras redes sociales

 https://www.facebook.com/devs4j/ 

https://twitter.com/devs4j.

Autor: Alejandro Agapito Bautista
Twitter: @raidentrance
Contacto:raidentrance@gmail.com

Anuncios

Categorías:Español

Tagged as: , , , ,

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s