Jfinal中关于Model的setAttrs()方法丢失字段类型问题

justFinal 发布于 2015/08/27 19:24
阅读 784
收藏 0

@JFinal 詹总,请教一下:

     我url传递过来的json串转成map<String, Object>后,通过Model的setAttrs方法,把map转成model时发现类型出现了问题!

比如,在我的table中定义了字段A,类型为BigDecimal,url传递的json串中A的值为1,通过上述方式转换完之后,发现Model中字段A变成了Integer类型,通过model.getBigDecimal()获取不到字段A,会抛出异常。

请问,这种情况下,应该如何保证model的类型?

多谢!

加载中
0
JFinal
JFinal

    当使用第三方工具将 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) 的方式来接收数据,此法可以实现类型的精确转换。


JFinal
JFinal
回复 @justFinal : 升级到 jfinal 2.1 后就不必这么麻烦了,极速支持,等着升级吧,哈哈
j
justFinal
回复 @JFinal : 嗯,看了下ModelInjector的代码,模仿着自己实现了下json转model。多谢波哥!
JFinal
JFinal
回复 @justFinal : 具体到你的应用场景,你可以在 YourModel 中添加一个 fromJson(String) 方法,将 json 数据直接转成 model。这个功能 jfinal 已经做过备忘,一直没顾上实现
JFinal
JFinal
回复 @justFinal : jfinal 是默认类型是正确的,所以没做转换。类型转换是在 Controller.getModel(...) 中来做的。
j
justFinal
@JFinal 多谢詹总及时回复。 因为我的工程是专为手机访问的rest api,所以统一使用了json来传递参数; 另外在jfinal的Model父类中使用setAttrs()方法,我看了一下源码,是已经获取了activerecord.Table的,但是没有做任何处理,只是判断了一下是否含有字段,直接就put进去了;为什么不在这里就把类型转好以后再put进去呢?
返回顶部
顶部