发现了一个不是bug的bug

使用的是freemarker做模板引擎,发现当在控制器中,设置了一个变量 setAttr("class","123");后,然后在视图中调用时,${class} 始终输出的是 class java.util.HashMap  ,当把class改名为class2后或者其他字符串时,问题就解决了,难道是不能用class做变量名称吗?

评论区

flash866

2018-04-17 23:55

再次测试发现,在任意view页面里面 使用 ${class} 都能输出 class java.util.HashMap

JFinal

2018-04-18 00:25

@flash866 这个如果真有问题,那必定是 freeMarker 的问题, ${class} 这种最基本的输出, jfinal 是不可能进行干预的

换个变量名试试,例如: ${value}

flash866

2018-04-18 08:43

@JFinal 换变量名是可以的,我已给官方提交了bug

flash866

2018-04-19 10:55

@JFinal 波总,Freemarker的官方给回复了,说不是bug。原文是:This depends on what {{ObjectWrapper}} is used in the {{Configuration}} (and what the root object is, and in your case it's a `HashMap`). Fortunately, the default {{ObjectWrapper}} doesn't do such thing. A pure {{BeansWrapper}} with {{simpleMapWrapper}} set to {{false}} does (because `getClass()` defines a JavaBean property according the JavaBeans Spec.), but that's not a recommended setup.

JFinal

2018-04-19 11:00

@flash866 这个只是告诉你原因,但 freemarker 的这个设计并不好,让人产生误解,而且在功能上也有问题

setAttr("class", "value");
${class}
上面的用法很显然是符合 freemarker 的规则的,但却得到了非预期之类的结果,显然是不好的设计

从使用规则上来说,说它是个 bug ,一点也不冤枉

JFinal

2018-04-19 11:01

你试一下 jfinal enjoy 引擎这样来用,一点问题都没有

flash866

2018-04-19 13:17

@JFinal 谢谢波总回复,其实我是看不懂回复,英语很差

热门反馈

扫码入社