Skip to content

介绍

在使用MyBatis Plus进行开发时,遇到实体类字段缺失问题。错误提示显示需要某些字段,但实体类中并未定义这些字段。

1.原因

实体类没有重写TreeNode类所要求的方法和字段,导致树形工具类在操作时无法找到必要的字段或方法。

树形工具类

ts
public abstract class TreeNode {

    /**
     * 当前节点id
     */
    public abstract Long getNodeId();

    /**
     * 父级节点id
     */
    public abstract Long getNodePId();

    /**
     * 是否根节点
     */
    @Getter
    private Boolean rootNode;

    /**
     * 是否叶子节点
     **/
    @Getter
    private Boolean leafNode;

    /**
     * 子节点数据
     **/
    @Getter
    private List<TreeNode> children;

    /**
     * 设置子节点数据,设置为protected禁止外部调用
     **/
    public void setChildren(List<TreeNode> children) {
        this.children = children;
        this.rootNode = Objects.equals(getNodePId(), -1L);
        this.leafNode = children == null || children.isEmpty();
    }

}

2.未修改前的实体类

ts

@Getter
@Setter
@TableName("share_comment_reply")
public class ShareCommentReply extends TreeNode implements Serializable {

    // ... 其他字段

    @Override
    public Long getNodeId() {
        return id;
    }

    @Override
    public Long getNodePId() {
        return parentId;
    }
}

2.修改后的实体类

ts

@Getter
@Setter
@TableName("share_comment_reply")
public class ShareCommentReply extends TreeNode implements Serializable {

    // ... 其他字段

    @Override
    public Long getNodeId() {
        return id;
    }

    @Override
    public Long getNodePId() {
        return parentId;
    }

    // 添加 children 字段(非数据库字段)
    @TableField(exist = false)
    private List<TreeNode> children;

    @TableField(exist = false)
    private Boolean rootNode;

    @TableField(exist = false)
    private Boolean leafNode;


    @Override
    public void setChildren(List<TreeNode> children) {
        this.children = children;
        this.rootNode = Objects.equals(getNodePId(), -1L);
        this.leafNode = children == null || children.isEmpty();
    }
}

总结

实体类继承了TreeNode类,但只实现了部分方法getNodeId()getNodePId(), 缺失接口要求的其他方法和字段,导致树形工具类操作时无法设置子节点列表。

上次更新于: