Le printemps 3 a introduit un nouveau langage d'expression (SpEL) qui peut être utilisé dans de haricots définitions. La syntaxe elle-même est assez bien indiqué.
Ce n'est pas clair, c'est comment, le cas échéant, SpEL interagit avec la propriété de l'espace réservé de la syntaxe, qui était déjà présent dans les versions antérieures. Ne SpEL ont le support de la propriété des espaces réservés, ou dois-je combiner la syntaxe de ces deux mécanismes et de l'espoir qu'ils se combinent?
Permettez-moi de donner un exemple concret. Je veux utiliser la syntaxe de la propriété ${x.y.z}
, mais avec l'ajout de "valeur par défaut" de la syntaxe, comme prévu par le elvis opérateur pour gérer les cas où l' ${x.y.z}
n'est pas défini.
J'ai essayé les syntaxes suivantes sans succès:
#{x.y.z?:'defaultValue'}
#{${x.y.z}?:'defaultValue'}
Le premier me donne
Champ ou bien " x " ne peut pas être trouvé sur l'objet de type 'org.springframework.les haricots.usine.config.BeanExpressionContext'
ce qui suggère que SpEL ne reconnaît pas cela comme une propriété de l'espace réservé.
La deuxième syntaxe renvoie une exception en disant que l'espace réservé n'est pas reconnue, de sorte que l'espace réservé résolveur est invoquée, mais est défectueux comme prévu, étant donné que la propriété n'est pas définie.
Les docs ne font aucune mention de cette interaction, de sorte que soit une telle chose n'est pas possible, ou il est sans-papiers.
Quelqu'un a réussi à faire cela?
OK, je viens avec un petit, autonome cas de test pour cela. Tout cela fonctionne comme-est:
Tout d'abord, le haricot définitions:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
">
<context:property-placeholder properties-ref="myProps"/>
<util:properties id="myProps">
<prop key="x.y.z">Value A</prop>
</util:properties>
<bean id="testBean" class="test.Bean">
<!-- here is where the magic is required -->
<property name="value" value="${x.y.z}"/>
<!-- I want something like this
<property name="value" value="${a.b.c}?:'Value B'"/>
-->
</bean>
</beans>
Ensuite, le trivial bean classe:
package test;
public class Bean {
String value;
public void setValue(String value) {
this.value = value;
}
}
Et enfin, le cas de test:
package test;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class PlaceholderTest {
private @Resource Bean testBean;
@Test
public void valueCheck() {
assertThat(testBean.value, is("Value A"));
}
}
Le défi à venir avec un SpEL expression dans les grains de fichier qui me permet de spécifier une valeur par défaut dans les cas où l' ${x.y.z}
ne peut pas être résolu, et ce défaut doit être spécifié en tant que partie de l'expression, pas extériorisé dans un autre jeu de propriétés.