Настроить velocity для рендеринга объекта с помощью чего-то другого, кроме toString?

StackOverflow https://stackoverflow.com/questions/375128

Вопрос

Есть ли способ настроить Velocity на использование чего-то другого, кроме toString(), для преобразования объекта в строку в шаблоне?Например, предположим, что я использую простой класс date с методом format() и каждый раз использую один и тот же формат.Если весь мой код velocity выглядит следующим образом:

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

есть ли какая-то конфигурация, которую я мог бы добавить, которая позволила бы мне просто сказать

$someDate

вместо этого?(Предполагая, что я не в состоянии просто отредактировать класс date и присвоить ему соответствующий toString()).

Я делаю это в контексте веб-приложения, созданного с помощью WebWork, если это поможет.

Это было полезно?

Решение

Вы также можете создать свой собственный ReferenceInsertionEventHandler, который отслеживает ваши даты и автоматически выполняет форматирование за вас.

Другие советы

Velocity допускает использование утилиты, подобной JSTL, под названием velocimacros:

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

Это позволило бы вам определить макрос, подобный:

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

А потом назовите это вот так:

#d($someDate)

О, и версии Velocity 1.6+ имеют новый визуализируемый интерфейс.Если вы не возражаете привязать свой класс date к API Velocity, то реализуйте этот интерфейс, и Velocity будет использовать метод render(context, writer) (в вашем случае вы просто игнорируете контекст и используете writer) вместо toString() .

Я тоже столкнулся с этой проблемой, и я смог решить ее, основываясь на Натан Бубна ответь.

Я просто пытаюсь завершить ответ, предоставляя ссылка на документацию Velocity в котором объясняется, как использовать обработчики событий.

В моем случае мне нужны были вызовы Velocity "getAsString" вместо метода toString для всех объектов JsonPrimitive из библиотеки gson каждый раз, когда вставлялась ссылка.

Это было так же просто, как создать

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;
    }

}

И добавьте событие в VelocityContext

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

...

context.attachEventCartridge(vec);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top