如果value为null,则保留FreeMarker Markup

时间:2012-11-15 13:04:16

标签: java nullpointerexception freemarker

因此,如果提供的数据模型不包含该值,我目前正在尝试确定是否仍然保留freemarker标记。我知道${VALUE!"DEFAULTVALUE"},但这不适用于FreeMarker标记。

基本上,我正在尝试做的事情是:

${TEST}${1}${2}

如果数据模型设置如下:

Map root = new HashMap();
root.put("1","ONE");
root.put("2","TWO");

当这个应用于Template对象时,会抛出null错误,因为测试未定义。我想要发生的是,如果TEST未定义,模板仍应处理成以下内容:

${TEST}ONETWO

有没有办法使用FreeMarker库中的功能?我可以通过模式匹配来做到这一点,但必须有一个更简单的方法。

感谢。

2 个答案:

答案 0 :(得分:2)

尝试将?has_content用于TEST,也许这会有所帮助。但我不确定,如果这符合您的要求。

答案 1 :(得分:0)

FreeMarker库允许您编写自定义异常处理程序。

不幸的是,FreeMarker没有提供失败的确切令牌,但您可以从错误消息中解决它。

        cfg.setTemplateExceptionHandler(new TemplateExceptionHandler() {
        @Override
        public void handleTemplateException(TemplateException te, Environment e, Writer writer) throws TemplateException {
            try {
                String errorString = te.getFTLInstructionStack();
                int startIndex = errorString.indexOf('$');

                if (startIndex != -1) {
                    int endIndex = errorString.indexOf('}', startIndex);
                    if (endIndex != -1) {
                        writer.write(errorString.substring(startIndex, endIndex + 1));
                    }
                    else {
                        throw te;
                    }
                }
                else {
                    throw te;
                }
            }
            catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    });