我正在使用Smooks for EDI Translations开发freemarker模板
我只是以16位十六进制格式执行字符串的MD5哈希..
我无法找到在Freemarker逻辑中实现Md5哈希的相关语法
尝试导入时
#import java.security.MessageDigest
在smooks-config.xml文件的freemarker中,它会抛出错误
引起:freemarker.template.TemplateNotFoundException:找不到名称" java.security.MessageDigest"
的模板
答案 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)}