Как реализовать MD5 хеширование строки в freemarker

Я работаю над шаблоном freemarker, используя Smooks для EDI Translations

Я просто выполняю хеширование строки MD5 в 16-значном шестнадцатеричном формате.

Я не могу найти соответствующий синтаксис для реализации хеширования Md5 в логике Freemarker

при попытке импортировать

#import java.security.MessageDigest

в freemarker в файле smooks-config.xml выдает ошибку

Причина: freemarker.template.TemplateNotFoundException: шаблон не найден для имени "java.security.MessageDigest"

2 ответа

Если хеширование Md5 может быть выполнено статическим методом данного класса, и вы действительно не можете выполнить работу до обработки шаблона... вы можете предоставить этот класс шаблону.

Я не знаком со Smooks, но в основном вам нужно сказать Smooks ввести модифицированный FreemarkerManager который имеет переопределенный метод populateContext

public class MyFreemarkerManager extends FreemarkerManager {
    @Override
    protected void populateContext(ScopesHashModel model, ValueStack stack, Object action, HttpServletRequest request, HttpServletResponse response) {

        super.populateContext(model, stack, action, request, response);
        BeansWrapper beansWrapper = new BeansWrapperBuilder(Configuration.VERSION_2_3_24).build();
        TemplateHashModel staticModels = beansWrapper.getStaticModels();
        TemplateHashModel utils = (TemplateHashModel)staticModels.get("path.to.your.class.Utils");
        model.put("Utils", utils);
    }
}

Теперь все ваши шаблоны имеют прямой доступ к статическим методам Utils учебный класс

${Utils.hashMd5(s)}

Шаблоны FreeMarker могут только #import другие шаблоны FreeMarker (см. документацию). Кроме того, как правило, вы не должны рассчитывать такие вещи в шаблонах FreeMarker. Вы должны передать уже рассчитанную шестнадцатеричную строку в шаблон.

Но, если вы не можете выполнить вышеизложенное, то вы можете написать небольшой Java-объект с необходимыми методами, а затем добавить его в модель данных FreeMarker или в конфигурацию FreeMarker как "разделяемую переменную". Тем не менее, я не знаю, достаточно ли настраивается Smooks для этого.

Если Smooks не позволяет вам настраивать FreeMarker (как указано выше), вы можете написать TemplateMethodModel реализация в Java, которая вычисляет необходимое значение, а затем создает экземпляр этого в вашем шаблоне как <#assign md5 = 'com.example.MyMD5Method'?new()>, а потом вы можете делать такие вещи, как ${md5(something)} в FreeMarker. (Конечно, для этого необходимо добавить новый класс в ваше приложение.)

Другие вопросы по тегам