Simuler des paramètres null dans les macros Freemarker
Je suis en train de construire un site à l'aide de Freemarker et ont commencé à fortement à l'aide de macros. Je sais que dans Freemarker 2.3 que le passage d'une valeur null dans une macro en tant que paramètre est équivalent à ne pas passer d'un paramètre à tous j'ai donc créé une variable globale appelée "null" pour simuler null vérifier dans mes macros:
<#assign null="NUL" />
Maintenant dans mes macros je peux le faire:
<#maco doSomething param1=null>
<#if param1 != null>
<div>WIN!</div>
</#if>
</#macro>
Le problème vient, si je veux passer un paramètre qui n'est pas un scalaire. Par exemple, le passage d'une Liste (qui en Freemarker est un SimpleSequence) à la une de la macro et de la vérification à l'encontre de mon mot clé null rendements de l'erreur:
freemarker.de modèle.TemplateException:
La seule juridique des comparaisons entre
deux nombres, deux chaînes de caractères, ou les deux
des dates. De la main gauche opérande est une
freemarker.de modèle.SimpleSequence
De la main droite opérande est une
freemarker.de modèle.SimpleScalar
J'ai pris un coup d'oeil à la freemarker code et je peux voir le problème (ComparisonExpression.isTrue()):
if(ltm instanceof TemplateNumberModel && rtm instanceof TemplateNumberModel) {
...
}
else if(ltm instanceof TemplateDateModel && rtm instanceof TemplateDateModel) {
...
}
else if(ltm instanceof TemplateScalarModel && rtm instanceof TemplateScalarModel) {
...
}
else if(ltm instanceof TemplateBooleanModel && rtm instanceof TemplateBooleanModel) {
...
}
//Here we handle compatibility issues
else if(env.isClassicCompatible()) {
...
}
else {
throw new TemplateException("The only legal comparisons...", env);
}
Donc la seule solution que je vois est de définir isClassicCompatible à true, ce qui je pense va appeler toString() sur les deux objets, et de comparer le résultat. Toutefois, la documentation spécifiquement dit quoi que ce soit en s'appuyant sur d'anciennes fonctionnalités doivent être réécrites.
Ma quesion est, est-il une solution à ce qui ne repose pas sur les fonctions obsolètes?
source d'informationauteur Cameron
Vous devez vous connecter pour publier un commentaire.
La
null
de référence est, par conception, une erreur dans FreeMarker. La définition d'une coutume valeur null qui est une chaîne de caractères n'est pas une bonne idée pour les raisons que vous mentionnez. Les constructions suivantes doit être utilisée à la place:null
vous devez utiliser le??
opérateur:<#if (name??)>
null
vous devez utiliser le!
opérateur de spécifier une valeur par défaut:name!"No name"
?has_content
builtin:<#if (names?has_content)>
Vous pouvez spécifier une séquence vide comme valeur de paramètre par défaut dans une macro, et il suffit de tester si elle est vide.
Voici ce que j'ai fait, qui semble fonctionner dans la plupart des scénarios:
La valeur par défaut doit être un chaîne videet le null-vérification doit être ?has_content.
Un collègue de travail m'a suggéré un null-fonction de contrôle peut être la solution la plus élégante:
Courir avec cette idée, j'ai trouvé une autre solution possible dans le liste de diffusionqui est de créer un null-vérification de la fonction en Java, par l'extension TemplateMethodModelEx. Je peux les insérer directement dans mon modèle de carte, et disponible dans le monde entier dans tous mes modèles. Le résultant Freemarker code est assez propre:
Ce qui semble être la meilleure façon de simuler les paramètres nuls à l'intérieur d'une macro.
Vous pouvez vérifier si elle n'est pas un scalaire première:
C'est une autre solution qui peut s'adapter à votre besoin.
De définir une valeur par défaut objet vide
{}
au lieu de null pour éviter les 2 gros si le reste bloquer dans mon élément.assurez-vous que lorsque vous donnez une valeur par défaut de l'attribut (prénom dans mon cas), pour mettre la parenthèse à tous l'expression puis la ! signe.
Donc quel que soit le
identity
est pas défini oufirstName
est pas défini, freemarker utiliser la valeur par défaut