关于getModer方法的问题

比如有定义一个moder  里面定义了username 和 password的属性

如果在请求的时候  除了这两个参数以外  还携带了其他key的参数的话

getModer就崩溃了。

com.jfinal.plugin.activerecord.ActiveRecordException: The model attribute data is not exists.

at com.jfinal.core.Injector.injectModel(Injector.java:123)

at com.jfinal.core.Controller.getModel(Controller.java:702)


评论区

Pencilso

2016-12-25 10:19

看了下源代码
、Class colType = table.getColumnType(attrName);
if (colType == null) {
if (skipConvertError) {
continue ;
} else {
throw new ActiveRecordException("The model attribute " + attrName + " is not exists.");
}
}
好像是因为找不到这个字段名才报错的,另外我没搞懂,这个获取是从哪里获取的字段?
数据库吗?
有想过是否是在Moder的那个attr Map集合当中获取的,但是想想也不太可能啊,map只有set了之后才会添加这个字段的,如果这样的话,那岂不是要先遍历一下Moder的set方法,不然的话即使定义了字段也不会存在map当中啊,然而我追代码,最后追到的还真是一个map集合
就是他了:Table类下的一个属性 private Map> columnTypeMap; // config.containerFactory.getAttrsMap();
以上只是个人的一点愚见。

JFinal

2016-12-25 10:33

字段名是你的 ActiveRecordPlugin 在 start() 通过反射 model 所对应在的表得到的,如果你传过来的属性中有不存在的字段,只需要再多加个 true 参数即可:
getModel(..., true);

此外,即便你 get 的不是 Model,是普通 java bean ,只需要 getBean(...) 即可,该方法会自动根据你 java bean 中的 setter 方法进行注入

JFinal

2016-12-25 10:36

再补充一点,无论是 getModel 还是 getBean,默认都是需要在页面表单需要用一个 modelName或者 beanName 前缀的,如 name="user.nickName"

如果不希望有这个 "user" 这个前缀,只需要在 getModel 或 getBean 时第二个参数传入空串,或者 null 即可,例如:
getModel(User.class, "");
getBean(Article.class, null);

当然,你还可以传入第三个参数,这样页面过来的字段即便数据库中不存在也不会报错:
getModel(User.class, null, true)

jfinal 默认检测表单域中的字段是否存在,是为了防止开发者手误将字段名写错,避免问题远比问题出现后去解决问题要高明

JFinal

2016-12-25 10:37

上面这些用法在 jfinal 手册上都有说明,在首页下载 jfinal 手册一看就明白

Pencilso

2016-12-25 12:21

@JFinal 泪奔。。。。。。。。

Pencilso

2016-12-25 12:21

请原谅我没看仔细文档

热门反馈

扫码入社