【问题标题】:Preserving FreeMarker Markup if value is null如果值为 null,则保留 FreeMarker 标记
【发布时间】:2012-11-04 02:02:35
【问题描述】:

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

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

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

如果数据模型设置如下:

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

当它应用于 Template 对象时,会抛出 null 错误,因为 test 未定义。我想要实现的是,如果 TEST 未定义,则模板仍应处理为以下内容:

${TEST}ONETWO

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

谢谢。

【问题讨论】:

    标签: java nullpointerexception freemarker


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 您的回答很有用,但没有回答所提出的问题。
      猜你喜欢
      • 2019-04-04
      • 2016-04-24
      • 2022-11-15
      • 1970-01-01
      • 2018-04-11
      • 1970-01-01
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多