Configurer la vitesse pour rendre un objet avec autre chose que toString?
Question
Est-il possible de configurer la vitesse à utiliser autre chose que toString () pour convertir un objet en une chaîne dans un modèle? Par exemple, supposons que j'utilise une simple classe de date avec une méthode format (), et j'utilise le même format à chaque fois. Si tout mon code de vitesse ressemble à ceci:
$someDate.format('M-D-yyyy')
est-il une configuration que je pourrais ajouter qui me permettrait de dire
$someDate
au lieu? (En supposant que je ne suis pas en mesure de modifier simplement la classe de date et donner une toString appropriée ()).
Je fais cela dans le contexte d'un webapp construit avec WebWork, si cela aide.
La solution
Vous pouvez aussi créer votre propre ReferenceInsertionEventHandler qui surveille vos dates et fait automatiquement la mise en forme pour vous.
Autres conseils
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 l'appeler comme ceci:
#d($someDate)
Oh, et les versions 1.6+ de vitesse ont une nouvelle interface Renderable. Si vous ne me dérange pas attacher votre classe de date à une API de vitesse, puis implémenter cette interface et Velocity utilisera le rendu (contexte, écrivain) méthode (pour votre cas, vous ignorez le contexte et utiliser l'écrivain) au lieu de toString ( ).
Je fait face à ce problème aussi et j'ai pu le résoudre en fonction de Nathan Bubna réponse .
Je suis juste essayer de compléter la réponse fournissant lien vers documentation Velocity qui explique comment utiliser gestionnaires d'événements.
Dans mon cas, je avais besoin des appels Velocity « getAsString » au lieu de la méthode toString pour tous les objets de la bibliothèque JsonPrimitive gson chaque fois qui a été inséré une référence.
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);