jfinal 自定义属性 继承 Model 获取不到自定义属性值

/**
 * Generated by JFinal.
 */
@SuppressWarnings("serial")
public class Employee extends BaseEmployee<Employee> {
	public static final Employee dao = new Employee().dao();
	private Department dept = null;

	public String getSkillJson() {
		String skill = getSkill();
		if (StrKit.isBlank(skill)) {
			return JSONUtil.toJsonStr("[]");
		}

		System.out.println(skill);
		return JSONUtil.toJsonStr(skill.split(","));
	}

	public Department getDept() {
		System.out.println("this cid=" + this.getCid() + ",this id=" + this.getDid());
		return CACHE.getDepartment(this.getCid(), this.getDid());
	}

	// 员工所在部门
	public String getDeptName() {
		Department d = CACHE.getDepartment(this.get("cid"), this.get("did"));
		return d == null ? "" : d.getDeptName();
	}
}

使用Page<M>或者List<M>均无法读取到这几个属性值,直接使用Page<Employee>/List<Employee>是可以的。我写了一个公共的调用方法,子类都是继承自Model的,所在不想另外写了。请问下有什么办法吗?

我看了http://www.jfinal.com/feedback/3184这个帖子,如果设置了me.setJsonFactory(new FastJsonFactory()),程序挂了,而且这个是2018年的回复,不知道@JFinal有没有优化过。

我尝试加了以下代码

@Override
	protected Map<String, Object> _getAttrs() {
		// TODO Auto-generated method stub
		Map<String, Object> attrs = super._getAttrs();
		attrs.put("dept", getDept());
		attrs.put("dept_name", getDeptName());
		return attrs;
	}

结果又发现这个错误

this cid=null,this id=null

这个是打印语句,在这里调用了

public Department getDept() {
		System.out.println("this cid=" + this.getCid() + ",this id=" + this.getDid());
		return CACHE.getDepartment(this.getCid(), this.getDid());
}

但使用Employee emp=Employee.dao.findById()又可以。

评论区

JFinal

2020-07-04 21:58

默认的 json 转换用的是 JFinalJson.java 这个类文件,而它只会对 Model 中的 Map attrs 进行转换,会完全无视你的 getter 方法

所以要配置成 FastJson:
me.setJsonFactory(new FastJsonFactory());

这些问题在文档中已经详细说明:
https://jfinal.com/doc/12-3

JFinal

2020-07-04 22:00

使用任何一个框架,出现疑问要首先看看文档,况且 jfinal 的文档的量是极少极少的

要知道 jfinal 是完整的 web mvc + orm + aop + template engine。这么完整的功能,但文档很少很少,已经是尽全力在为你降低学习成本了

北流家园网

2020-07-04 23:03

@JFinal 我是看了文档不明白才来问的。配置为me.setJsonFactory(new FastJsonFactory());我试过了,也要在attrs中put自定义属性才可以,跟JFinalJson默认的没有什么区别了。我还发现个问题,配置me.setJsonFactory(new FastJsonFactory())后,我有些树形结构的数据出不来了,我树形结构数据是封装有一个方法自动转换List数据的。代码如下

/**
* 取得EasyUi中Tree控件的子树节点
*
* @param modelList
* 包含所有数据的Model列表
* @param idFieldName
* Model中ID字段名称
* @param parentIdFieldName
* Model中父ID字段名称
* @param textFieldName
* Model中名称字段名称,对应EasyUi的Tree控件中的text字段
* @param parentIdValue
* 父ID字段值
* @param level
* 树层级
* @return EasyUi中Tree控件的子树节点
*/
private static > List toTree(List modelList,
String idFieldName, String parentIdFieldName, String textFieldName,
Object parentIdValue, String iconCls, String cntName, int level) {
List retList = new ArrayList();

// 循环处理所有model
int n = 0;
for (M m : modelList) {
// 取得父ID字段值
Object id = m.get(parentIdFieldName);

// ID和传入的parentIdValue值是否相等
if ((parentIdValue == null && id == null)
|| (parentIdValue != null && parentIdValue.toString()
.equals(id.toString()))) {
// 如果相等,说明当前Model是子项,直接加入列表
retList.add(m);

// 递归地将当前Model的子树求出
List childrenList = toTree(modelList, idFieldName,
parentIdFieldName, textFieldName, m.get(idFieldName),
iconCls, cntName, level + 1);

// 子项列表,存放在children字段,此字段为指定字段
m.put(EASYUI_TREE_CHILDREN_NAME, childrenList);

if (StrKit.notBlank(cntName)) {
int cnt = m.getLong(cntName).intValue();
m.put(EASYUI_TREE_STATE_NAME, cnt > 0 ? "closed" : "open");
} else {
if (childrenList.size() > 0) {
//默认展开第一个节点
m.put(EASYUI_TREE_STATE_NAME, n++ == 0 ? "open"
: "closed");
} else {
m.put(EASYUI_TREE_STATE_NAME, "open");
}
}

if (StrKit.notBlank(iconCls)) {
if (!EASYUI_TREE_ICON.equals(iconCls)) {
m.put(EASYUI_TREE_ICON, m.getStr(iconCls));
}
}

// 如果Model中不存在text字段,则填充text字段,因为text字段是Tree控件指定字段
if (!EASYUI_TREE_TEXT_NAME.equals(textFieldName)) {
m.put(EASYUI_TREE_TEXT_NAME, m.getStr(textFieldName));
}

// 如果Model中不存在id字段,则填充id字段,因为id字段是Tree控件指定字段
if (!EASYUI_TREE_TEXT_ID.equals(idFieldName)) {
m.put(EASYUI_TREE_TEXT_ID, m.get(idFieldName));
}
}
}

return retList;
}

我当前的做法是,不配置me.setJsonFactory(new FastJsonFactory()),重写attr方法,将自定义属性put进去,这样貌似可以解决问题。
@Override
protected Map _getAttrs() {
// TODO Auto-generated method stub
Map attrs = super._getAttrs();
attrs.put("dept", dept);
attrs.put("deptName", getDeptName());
attrs.put("skillJson", getSkillJson());
attrs.put("skillText", getSkillText());
return attrs;
}

但我想,有没有更好的处理方法?

热门反馈

扫码入社