Configurare la velocità per rendere un oggetto con qualcosa di diverso toString?
Domanda
C'è un modo per configurare Velocity per usare qualcosa di diverso toString () per convertire un oggetto in una stringa in un modello? Ad esempio, supponiamo che io sto usando una semplice classe data con un metodo format (), e io uso lo stesso formato ogni volta. Se tutto il mio codice di velocità si presenta così:
$someDate.format('M-D-yyyy')
c'è qualche configurazione potrei aggiungere che sarebbe lasciatemi dire
$someDate
, invece? (Supponendo che io non sono in grado di modificare solo la classe data e dargli un adeguato toString ()).
sto facendo questo nel contesto di una webapp costruito con WebWork, se questo aiuta.
Soluzione
Si potrebbe anche creare il proprio ReferenceInsertionEventHandler che guarda per le date e fa la formattazione per voi automaticamente.
Altri suggerimenti
Velocity permette una JSTL come utility chiamata velocimacros:
http://velocity.apache.org/engine/devel /user-guide.html#Velocimacros
Ciò consentirebbe di definire una macro come:
#macro( d $date)
$date.format('M-D-yyyy')
#end
E poi chiamarlo in questo modo:
#d($someDate)
Oh, e le 1.6+ versioni di Velocity hanno una nuova interfaccia Renderable. Se non ti dispiace legare la classe data per un API Velocity, quindi implementare questa interfaccia e Velocity utilizzerà il metodo render (contesto, sceneggiatore) (per il vostro caso, è sufficiente ignorare il contesto e utilizzare lo scrittore), invece di toString ( ).
Ho affrontato anche questo problema e sono stato in grado di risolverlo sulla base di Nathan Bubna risposta .
Sto solo cercando di completare la risposta che fornisce il link Velocity documentazione che spiega come utilizzare EventHandlers.
Nel mio caso, avevo bisogno di chiamate Velocity "getAsString" invece di metodo toString per tutti gli oggetti JsonPrimitive dalla libreria GSON ogni volta che è stato inserito un riferimento.
E 'stato semplice come creare 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;
}
}
E aggiungere l'evento al VelocityContext
vec = new EventCartridge();
vec.addEventHandler(new JsonPrimitiveReferenceInsertionEventHandler());
...
context.attachEventCartridge(vec);