Jfinal中关于Model的setAttrs()方法丢失字段类型问题
@JFinal 詹总,请教一下:
我url传递过来的json串转成map<String, Object>后,通过Model的setAttrs方法,把map转成model时发现类型出现了问题!
比如,在我的table中定义了字段A,类型为BigDecimal,url传递的json串中A的值为1,通过上述方式转换完之后,发现Model中字段A变成了Integer类型,通过model.getBigDecimal()获取不到字段A,会抛出异常。
请问,这种情况下,应该如何保证model的类型?
多谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
@JFinal 多谢詹总及时回复。 因为我的工程是专为手机访问的rest api,所以统一使用了json来传递参数; 另外在jfinal的Model父类中使用setAttrs()方法,我看了一下源码,是已经获取了activerecord.Table的,但是没有做任何处理,只是判断了一下是否含有字段,直接就put进去了;为什么不在这里就把类型转好以后再put进去呢?
回复
jfinal 是默认类型是正确的,所以没做转换。类型转换是在 Controller.getModel(...) 中来做的。
回复
具体到你的应用场景,你可以在 YourModel 中添加一个 fromJson(String) 方法,将 json 数据直接转成 model。这个功能 jfinal 已经做过备忘,一直没顾上实现
回复
嗯,看了下ModelInjector的代码,模仿着自己实现了下json转model。多谢波哥!
回复
升级到 jfinal 2.1 后就不必这么麻烦了,极速支持,等着升级吧,哈哈
当使用第三方工具将 json 字符串转成 Map<String, Object> 时,json 数据类型会根据一定的规则转成相应的 java 类型,这其中的规则不一定会转正确的 Model 的字段类型,所以这类转换方式不可取。
最精确的转换需要根据Model 中的字段类型来决定如何将 json string 转成合适的类型,例如,json string 有一个键值对为:{"n", 123456},当这个值转成 java 类型时,如果字段类型为 Integer 就该是 Integer.parseInt("123456"),如果是字段类型为Long,就应该是 Long.parseLong("123456"); 简单来说就是光凭 json 字符串,无法确定最终转成具体的java 类型。
所以,要精确做到转换正确,就需要先得到Model 所对应的 com.jfinal.plugin.activerecord.Table 对象,这个对象中存放了model 每个字段的类型,写个工具类就可以转换。Table 对象的获取方式是:TableMapping.me().getTable(modelClass);
最后,建议在前端使用表单传递数据,然后在 controller 中使用 getModel(modelClass) 的方式来接收数据,此法可以实现类型的精确转换。