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.

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top