2012-07-23 8 views
7

que tienen el siguiente código utilizando lenguaje de expresión de primavera:manejar valores nulos en lenguaje de expresión de primavera

StandardEvaluationContext stdContext = new StandardEvaluationContext(); 
stdContext.setVariable("emp", filterInputData); 
ExpressionParser parser = new SpelExpressionParser();  
parser.parseExpression("#emp.?[name.toLowerCase().contains('Hari')]").getValue(stdContext); 

donde emp es el nombre del bean. Aquí el nombre puede ser nulo y cuando llamo al name.toLowerCase() obtengo una excepción nullpointer. ¿Cómo manejar los valores nulos en este escenario? Necesito llamar al toLowercase() solo para valores que no sean nulos.

+1

'toLowerCase(). Contains ('Hari')' 'es siempre false' – OrangeDog

Respuesta

19
"#emp.name != null ? #emp.name.toLowerCase().contains('hari') : null" 

o

"#emp.name != null ? #emp.name.toLowerCase().contains('hari') : false" 

dependiendo de lo que quieren de vuelta cuando el nombre no se encuentra.

En realidad, este pequeño formulario también funciona ...

"#emp.name != null ? toLowerCase().contains('hari') : null" 

Por cierto, en su pregunta original ...

name.toLowerCase().contains('Hari') 

nunca se volverá verdadero (H es mayúscula).

O, Elvis es su amigo ...

Expression expression = new SpelExpressionParser().parseExpression("#emp.name?:'no name found'"); 
value = expression.getValue(context, String.class).toLowerCase(); 
+0

Hola, Muchas gracias por su respuesta. En mi caso, el empleado es una colección de objetos. Entonces necesito obtener el nombre de la colección. Intenté con "#emp.? [Name! = Null? ToLowerCase(). Contains ('hari'): null]", pero no funciona y recibo un mensaje que dice que el método toLowercase no existe en EmployeeDto , ¿Podría ayudarme a solucionar este problema? Muchas gracias – user1293071

+0

No estoy seguro de por qué está tratando de usar la selección de colecciones. Si su colección es un mapa, esto funciona bien ... "#emp ['name']! = Null? #emp ['name']. ToLowerCase(). Contains ('hari'): false" –

+0

Funcionó, Muchas gracias por su apoyo y por ayudarme a encontrar una solución – user1293071

0

¿Se puede conectar automáticamente este bean a su clase?

Algo así como:

public class YourClass{ 
    @Autowire 
    private Employee emp 

    public boolean func(){ 
     if (emp.getName() != null){ 
      return emp.getName().toLowerCase().contains('Hari'); 
     }else{ 
      return false; 
     } 
    } 
} 
Cuestiones relacionadas