开发者社区> 问答> 正文

jfinal2.1新的BaseModel后台渲染问题及解决方案?报错

更新jfinal2.1必须要使用一下自动生成model的generator 。但是新生成的model由于继承了basemodel,导致jstl表达式在jsp端不如原先灵活了。

原先继承model,所有在后台setAttr(obj,obj)的时候,如果查询出来是一个多表查询的结果,会把原先不存在model的属性set到attr这个model自带的map中,所以前端还是可以直接使用${obj.xxx}的方式。

但是现在新版本,如果你继续这样使用会报错,因为现在的BaseModel中是没有这个属性的get和set方法的。

需要手动在集成了BaseModel的类中写一个新的set和get方法,如果业务逻辑复杂,很有可能会有很多的额外的get和set方法,虽然不是很优雅,不过还是能解决问题的。

如果遇到类似问题,希望能帮到大家解决。

展开
收起
爱吃鱼的程序员 2020-06-10 15:03:51 626 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

      jstl对javabean的getter方法会支持好些,所以jfinal2.1对生成了getter方法后的model/bean使用的是其getter方法进行输出。而关联查询得到的数据没能相应的 getter方法可以使用,所以数据就取不到了。

      这是一个两难的问题,jfinal下一版本会提供一个开关变量,让生成了getter方法的model仍然可以使用以前的用法,并且如果字段名也采用驼峰命名那就完美了。

    回复 @idreamblue:还可以这样用Db.execute(newCallback(){publicvoidcall(Connectionconn){}});这样用的话,可以不用管理connection的关闭与打开,直接用就好回复 @idreamblue:一直就有:DbKit.getConfig().getConnection() @idreamblue @JFinaljf能否考虑给一个单独获取connection的口子,在某些情况下一个connection我想让它干更多的活或者复杂事务控制更精细些呢,这种场景还是很常见的哟。回复 @idreamblue:有道理,jfinal下一版会仔细权衡。无论怎样,有没有getter和setter,以前的用法都必须是支持的我认为当初jfinal把model这层搞成弱模型是明智的,也是一大亮点再结合freemarker简直是渲染神奇而躲避了强模型为了联合查询而增加对应字段的不优雅。2.1增加getter和setter是为了消除记忆负担和兼容一些人的要求而已。所以我建议 @JFinal还是默认保持以前的规则,增加开关来满足纯javabean模式。

     jfinal2.2提供了一个开关变量,可以让Bean使用之前Model的取值方式:

    ModelRecordElResolver.setResolveBeanAsModel(true);

    具体用法见这里: http://www.oschina.net/news/70001/jfinal-2-2

    回复 @JFinal:谢谢,已解决回复 @文心含龙:如果希望转换过程临时不依赖于getter方法,可以使用JFinalJson().getJson().toJson(....)回复 @文心含龙:没什么奇怪的,fastjson只会处理getter方法,所以有些属性你如果没有提供相应的getter方法自然就无法转换,例如model.put("otherAttr",123)这样的就不会转换了回复 @JFinal:解决了,不过有新问题。设置fastjsonrenderjson(Object)的时候,会遇到model只有部分属性转化,但是用Jfinal自带的JsonKit就没这问题。挺奇怪的回复 @文心含龙:感觉如何,解决问题了吧?mark现在在页面使用是数据库字段首字母小写驼峰命名的形式就可以显示了,和原来直接与数据库字段同名相比确实麻烦了一些

    @JFinal

    关注。

    2020-06-10 15:04:06
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
函数计算最佳实践:快速开发一个分布式 Puppeteer 网页截图服务 立即下载
QQ移送页面框架优化实践 立即下载
QQ移动页面框架优化实践 立即下载