Configurar a velocidade para tornar um objeto com outra coisa que não toString?
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.
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);