前台需要获取easyui tree格式的数据时,就需要将查询出的实体构成所需要的格式,一个项目可能有n多树,直接写个方法方便转换,顺便给自己备忘
首先tree的枚举
public enum TreeNodeType {
ID,
TEXT,
STATE,
ICON,
CHECKED,
ATTRIBUTES,
ORDER,
EXTVALUE,
CHILDREN,
PARENTID
}
注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface TreeType {
public TreeNodeType type();
}
//tree格式实体类
import java.io.Serializable;
import java.util.List;
public class TreeNode implements Serializable{
private static final long serialVersionUID = 2995243732685598224L;
private String id;
private String text;
private String state;
private String iconCls;
private boolean checked;
private Object attributes;
private int order;
private String extValue;
private List<TreeNode> children;
private String parentId;
public String getId() {
return id;
}
.....
.....
/**
* 转换单个实体为TreeNode格式
* @param bean
* @param nodeArgs 如果不为空 设置tree的打开state,以及显示的icon样式
* @return
*/
public static TreeNode TransClsToTreeNode(Object bean,TreeNode nodeArgs){
TreeNode node = new TreeNode();
Class<?> beanClass = (Class<?>)bean.getClass();
Field[] fs = beanClass .getDeclaredFields();
for (Field f : fs) {
f.setAccessible(true); //设置些属性是可以访问的
TreeType treeType = f.getAnnotation(TreeType.class);
if(treeType!=null){
try {
Object val = f.get(bean);//得到此属性的值
TreeNodeType eType = treeType.type();
if(val!=null&&eType.name().equals(TreeNodeType.ID.name())){
node.setId(val.toString());
}else if(val!=null&&eType.name().equals(TreeNodeType.TEXT.name())){
node.setText(val.toString());
}else if(val!=null&&eType.name().equals(TreeNodeType.ICON.name())){
node.setIconCls(val.toString());
}else if(val!=null&&eType.name().equals(TreeNodeType.ATTRIBUTES.name())){
node.setAttributes(val);
}else if(val!=null&&eType.name().equals(TreeNodeType.ORDER.name())){
node.setOrder(Integer.parseInt(val.toString()));
}else if(val!=null&&eType.name().equals(TreeNodeType.EXTVALUE.name())){
node.setExtValue(val.toString());
}else if(val!=null&&eType.name().equals(TreeNodeType.PARENTID.name())){
node.setParentId(val.toString());
}
if(nodeArgs!=null){
if(nodeArgs.getState()!=null&&!nodeArgs.getState().equals("")){
node.setState(nodeArgs.getState());
}
if(nodeArgs.getIconCls()!=null&&node.getIconCls().equals("")){
node.setState(nodeArgs.getIconCls());
}if(nodeArgs.getExtValue()!=null&&!nodeArgs.getExtValue().equals("")){
node.setExtValue(nodeArgs.getExtValue());
}
}
List<TreeNode>children = new ArrayList<TreeNode>();
node.setChildren(children);
node.setChecked(false);
node.setState("open");
} catch (Exception e) {
return null;
}
}
}
return node;
}
/**
* 递归构造TreeNode集合
* @param beans //实体集合
* @param nodes //new 一个即可
* @param pid //首次父id
* @return
*/
public static <T> List<TreeNode> bulidTreeNode(List<T>beans,List<TreeNode>nodes,String pid,TreeNode nodeArgs){
String parentId="";
String clsId="";
for (Object bean : beans) {
Class<?> beanClass = (Class<?>)bean.getClass();
Field[] fs = beanClass .getDeclaredFields();
for (Field f : fs) {
f.setAccessible(true); //设置些属性是可以访问的
TreeType treeType = f.getAnnotation(TreeType.class);
if(treeType!=null){
try {
Object val = f.get(bean);//得到此属性的值
TreeNodeType eType = treeType.type();
if(eType.name().equals(TreeNodeType.ID.name())){
clsId= val.toString();
}
if(eType.name().equals(TreeNodeType.PARENTID.name())){
parentId = val.toString();
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
if(parentId!=""&&parentId.equals(pid)){
TreeNode node = TransClsToTreeNode(bean,nodeArgs);
nodes.add(node);
bulidTreeNode(beans, node.getChildren(), clsId,nodeArgs);
}
}
return nodes;
}
使用:
需要转换的根据相应情况填写注解
public class testTree implements Serializable{
private static final long serialVersionUID = -667055066413799654L;
@TreeType(type=TreeNodeType.ID)
private int dicId; //id
@TreeType(type=TreeNodeType.TEXT)
private String dicName; //字典名称
private String dicValue; //字典值
@TreeType(type=TreeNodeType.EXTVALUE)
private String dicType; //字典类型
private String dicRemark; //备注
@TreeType(type=TreeNodeType.ORDER)
private int dicOrder; //排序
@TreeType(type=TreeNodeType.PARENTID)
private int dicParent; //父节点
private String dicExtValue; //扩展值
private boolean dicIsDel;//是否禁用
private String dicIcon;//图表
private boolean dicIsParent;//是否是父节点
public get... set.....
掉用
public List<TreeNode> buildTreeNode() {
List<TreeNode>nodes = new ArrayList<>();
List<SysDictionary> dics = sysDictionaryDAO.getDicByCondition(dic);
List<TreeNode>bulidNode = TranslateUtil.bulidTreeNode(dics, nodes, "父id"," 改变图标及是否打开");
//loadTreeNode(dics, nodes, -1);
return bulidNode;
}