如何在freemarker中实现字符串的MD5哈希

时间:2018-04-17 14:27:48

标签: java freemarker smooks

我正在使用Smooks for EDI Translations开发freemarker模板

我只是以16位十六进制格式执行字符串的MD5哈希..

我无法找到在Freemarker逻辑中实现Md5哈希的相关语法

尝试导入时

#import java.security.MessageDigest

在smooks-config.xml文件的freemarker中,它会抛出错误

  

引起:freemarker.template.TemplateNotFoundException:找不到名称" java.security.MessageDigest"

的模板

2 个答案:

答案 0 :(得分:0)

FreeMarker模板只能#import个其他FreeMarker模板(请参阅documentation)。此外,通常,您不应该在FreeMarker模板中计算此类内容。您应该将已经计算的十六进制字符串传递给模板。

但是,如果您不能执行上述操作,那么您可以在Java中编写一个具有所需方法的小实用程序对象,然后将其添加到FreeMarker数据模型或FreeMarker配置中作为& #34;共享变量"。但是,我不知道Smooks是否具有足够的可配置性。

如果Smooks不允许你配置很多FreeMarker(如上所述),你可以用Java编写一个TemplateMethodModel实现来计算你需要的值,然后在你的模板中创建一个实例作为<#assign md5 = 'com.example.MyMD5Method'?new()>,然后您可以在FreeMarker中执行${md5(something)}之类的操作。 (当然,这要求您可以在应用程序中添加新类。)

答案 1 :(得分:0)

如果可以通过给定类的静态方法执行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)}