关于#if指令当对象的值为null时返回true的问题

当前版本4.8

如下图

image.png

模板代码如下

<div style="background: red">
  #if(null)
    null is true
  #else
    null is false
  #end
</div>
<div style="background: blue">
  #article("5e0073d4e4b02b38b1c6d036")
    <p>article.cover value:#(article.cover)</p>
    <hr>
    #if(article.cover)
      article.cover is true
    #else
      article.cover is false
    #end
    <hr>
    #(article)
  #end
</div>

#article 指令为我自定义的指令,该指令向当前scope注入了article对象,article对象是用map封装的,这个问题困扰了我一天,但是通过#set(foo={"bar":null})却是正常的,目前没找到原因,可能是engine内部的问题


评论区

JFinal

2019-12-25 23:51

很可能是作用域的问题,注意在你的指令里头使用 scope.set(key ,value),不要使用 scope.setLocal(...),也不要使用 setGlobal(key, value)

前面那个会自动处理作用域的问题,后面两个一个是在顶层直接入变量,另一个是在底层直接放变量

你碰到的这个问题,可以在 Scope 的 setter、getter 方法中设置断点,一下就明白了

我估计你在 ArticelDirective 中使用 Scope 时出了问题,将这块代码贴出来吧

Dull

2019-12-26 10:16

已找到原因,因为用了第三方的hutool工具类的JSONUtil做parse,这个工具类在parse的时候把null反序列化成了cn.hutool.json.JSONNull对象,其
public String toString() {
return "null";
}
不是JFinal的锅,还真是坑无处不在。。。

JFinal

2019-12-26 10:20

@Dull 这种坑就需要仔细调试才能找出来了

昨天我已经看到一个奇怪的地方,你的 #(article.cover) 居然输出了 null , 而 enjoy 的输出指令碰到 null 值时是不会有任何输出的

所以,昨天应该从我上面这个发现着手,应该要想到 article.cover 的 toString() 是 "null"

Dull

2019-12-26 10:32

我之所以没从这方便想就是因为在打印#(article)对象的时候cover居然输出了null,而不是带着双引号的null,createTime和html的字符串都带着双引号,所以我一直没往字符串方面想,不过官方能优化这块吗

JFinal

2019-12-26 10:36

@Dull 在 java 代码中的 "null" 输出到模板中的时候是不会带双引号的,因为双引号只是 String 的定界字符,而不是字符串中的内容部分。

不光是输出到模板中,你输出到控制台也是一样不会有双引号的,例如:
System.out.println("null");

热门反馈

扫码入社