model属性如何过滤

向前段渲染List<Model>   json串时,如何将model中的某些属性过滤掉?

评论区

JFinal

2018-01-17 21:00

用一下 Model 中的 keep(...) 与 remove(...) 方法,前者保持住指定的属性,删除其它属性,后者反之

注意,这两个方法,可同时传多个参数,例如:
user.keep("userName", "password");

King

2018-01-17 21:09

@JFinal 非得循环keep吗?

JFinal

2018-01-17 21:14

@King 当然不是,sql 语句中的 select 中去控制是最简单有效的,例如:
select title, content from article where ...

而不是 select * from article where ...

JFinal

2018-01-17 21:24

select * 改为 select 确定需要的字段,这样在 renderJson 时就用过滤了

King

2018-01-18 09:31

@JFinal 有两个问题:
1、前后端分离时,admin工程里只负责调用service接口,不涉及到数据库,此时user.keep(...)方法报错,因为里面用到了Config。
2、user继承Model,向前端渲染json时,把Model里的attrNames、attrValues、attrsEntrySet也当作user属性渲染出来了。

JFinal

2018-01-18 11:37

@King 第一个确实是 jfinal 需要改进的一个地方,jfinal 3.4 会改进这里,目前建议如下几个主方案:
1:在 src/main/resources 下创建 com.jfinal.plugin.activerecord 包,然后将 jfinal 的 Model 拷贝一份进去,然后对 keep(...) 方法做点修改,在 Config config = _getConfig(); 这行代码下面添加下面的两行代码;
if (config == null ) {
config = DbKit.brokenConfig;
}

2:如果你扩展过中间 Model,可以这个中间 Model 中覆盖这个 keep(...) 方法

第二个问题,使用新版本的 jfinal 是不会出现的,因为新版本的 Model,里头的 getAttrName 的 getter 方法都添加了下划线前缀

记得搞定后回来分享一下

JFinal

2018-01-18 12:03

前后端分离的场景,注意也可用一下下面的代码创建一个 ActiveRecordPlugin:
ActiveRecordPlugin.useAsDataTransfer(...);

useAsDataTransfer(...) 方法中的各项参数,使用与后端一样的配置,例如 Daielct 之类的,这样可以保持统一

King

2018-01-18 18:06

@JFinal 按你这解决方法可以解决属性过滤的问题,但有一个新问题,某个属性值为空时,renderjson把这个属性也过滤掉了。。。能否string类型为空时转为“”,integer为空时转为0,list为空时转化为null,等等,这样处理呢?

King

2018-01-18 18:11

fastjson可以达到我说的要求,但keep就失去效果了。(先keep再fastjson属性没有过滤掉)

JFinal

2018-01-18 18:16

@King keep 与 fastjson 配合没理由不可以,你仔细调试一下

King

2018-01-19 08:41

@JFinal 发现问题所在了,
constants.setJsonFactory(FastJsonFactory.me());

Page page = userService.findPage(user, pageNumber, pageSize);
page.getList().stream().parallel().forEach(o -> o.keep("userId", "userCode", "userName", "userLogo", "type", "year", "area", "clickNum"));

Ret ret = Ret.create().set("result", 0).set("message", "成功").set("body", page);

renderJson(JSON.toJSONString(ret, features));

Page对象中使用的User类型,虽然在keep操作中移除了部分属性,但在JSON.toJSONString(ret, features)操作中,fastjson会引用原来的User中的属性,这样,最终的json中还是包含了所有User中的属性,从而keep操作就失效了。

热门反馈

扫码入社