2008-12-17 4 views
1

Est-il possible de configurer Velocity pour utiliser autre chose que toString() pour convertir un objet en chaîne dans un modèle? Par exemple, supposons que j'utilise une classe de date simple avec une méthode format() et que j'utilise le même format à chaque fois. Si tout mon code de vitesse ressemble à ceci:Configurer la vélocité pour rendre un objet avec autre chose que toString?

$someDate.format('M-D-yyyy') 

est là une configuration que je pourrais ajouter qui me permettrait de dire

$someDate 

à la place? (En supposant que je ne suis pas en mesure de simplement modifier la classe de date et lui donner un toString() approprié. Je le fais dans le contexte d'une webapp construite avec WebWork, si cela peut aider.

Répondre

1

Vous pouvez également créer votre propre ReferenceInsertionEventHand ler qui surveille vos dates et effectue automatiquement le formatage pour vous.

1

Velocity permet une JSTL comme utilitaire appelé Velocimacros:

http://velocity.apache.org/engine/devel/user-guide.html#Velocimacros

Cela vous permet de définir une macro comme:

#macro(d $date) 
    $date.format('M-D-yyyy') 
#end 

Et puis appelez comme ceci:

#d($someDate) 
+0

Et cela aussi fixé comme format par défaut. Pas besoin de le passer partout. Une meilleure idée, en effet. –

1

Oh, et les versions 1.6+ de Velocity ont une nouvelle interface Renderable. Si cela ne vous dérange pas d'attacher votre classe de date à une API Velocity, implémentez cette interface et Velocity utilisera la méthode render (context, writer) (pour votre cas, vous ignorez simplement le contexte et utilisez le writer) au lieu de toString ().

0

J'ai fait face à ce problème aussi et j'ai été capable de le résoudre basé sur Nathan Bubna answer.

J'essaie simplement de compléter la réponse en fournissant le link to Velocity documentation qui explique comment utiliser EventHandlers. Dans mon cas, j'avais besoin d'appels Velocity "getAsString" au lieu de la méthode toString pour tous les objets JsonPrimitive de la bibliothèque gson chaque fois qu'une référence était insérée.

Il était aussi simple que la création d'un

public class JsonPrimitiveReferenceInsertionEventHandler implements ReferenceInsertionEventHandler{ 

    /* (non-Javadoc) 
    * @see org.apache.velocity.app.event.ReferenceInsertionEventHandler#referenceInsert(java.lang.String, java.lang.Object) 
    */ 
    @Override 
    public Object referenceInsert(String reference, Object value) { 
     if (value != null && value instanceof JsonPrimitive){ 
      return ((JsonPrimitive)value).getAsString(); 
     } 
     return value; 
    } 

} 

Et ajouter l'événement à la VelocityContext

vec = new EventCartridge(); 
vec.addEventHandler(new JsonPrimitiveReferenceInsertionEventHandler()); 

... 

context.attachEventCartridge(vec); 
Questions connexes