Pergunta

Existe uma maneira de Velocity configure para usar algo diferente de toString () para converter um objeto para uma string em um modelo? Por exemplo, suponha que eu estou usando uma classe data simples com um método format (), e eu usar o mesmo formato de cada vez. Se todos os meus velocidade olhares código como este:

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

Existe alguma configuração que eu poderia acrescentar que iria deixar-me apenas dizer

$someDate

em vez disso? (Supondo que eu não estou em posição de apenas editar a classe data e dar-lhe um toString apropriado ()).

Estou fazendo isso no contexto de um webapp construído com WebWork, se isso ajuda.

Foi útil?

Solução

Você também pode criar seu próprio ReferenceInsertionEventHandler que os relógios para suas datas e automaticamente faz a formatação para você.

Outras dicas

Velocity permite uma JSTL como utilitário chamado velocimacros:

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

Isso permitirá que você para definir uma macro como:

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

E, em seguida, chamá-lo assim:

#d($someDate)

Oh, e os 1.6+ versões do Velocity tem uma nova interface Renderable. Se você não se importa amarrar sua classe data para um API Velocity, em seguida, implementar essa interface e Velocity usará o método render (contexto, escritor) (para o seu caso, você simplesmente ignorar o contexto e use o escritor), em vez de toString ( ).

Eu enfrentei esse problema também e eu era capaz de resolvê-lo com base em Nathan Bubna resposta .

Eu estou apenas tentando completar a resposta fornecendo o link para Velocity documentação que explica como usar EventHandlers.

No meu caso, eu precisava Velocity chama de "getAsString" em vez do método toString para todos JsonPrimitive objetos da biblioteca Gson cada vez que foi inserida uma referência.

Foi tão simples como a criação de um

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 adicionar o evento ao VelocityContext

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

...

context.attachEventCartridge(vec);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top