该注解可用于前端树形/层级数据的展示时,最后一层的数据点开以后为空的问题
这么说可能有点抽象,那么直接上图!
在这里三级部门后面是没有部门的。按说后面的层级应该不显示才对,可是三级部门后面还有一个 > ,点开以后确实红色框框这样什么都没有是空白的。
正常来说不应该再显示 >了,那么就不能展开,这才是正常的逻辑。那么该如何解决呢,答案就是:使用@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class CategoryEntity implements Serializable { private static final long serialVersionUID = 1L; /** * id */ @TableId private Long id; /** * 名称 */ private String name; /** * 父分类 id */ private Long parentId; /** * 层级 */ private Integer catLevel; /** * 0 不显示,1 显示] */ @TableLogic private Integer isShow; /** * 排序 */ private Integer sort; /** * 图标 */ private String icon; /** * 统计单位 */ private String proUnit; /** * 商品数量 */ private Integer proCount; /** * 1. childrenCategories 表示某个分类的子分类集合 * 2. @TableField(exist = false) 表示 childrenCategories 不对应表的字段 */ /** * 1. @JsonInclude(JsonInclude.Include.NON_EMPTY) * 表示如果 childrenCategories 的值是空数组,就不返回 */ @TableField(exist = false) @JsonInclude(JsonInclude.Include.NON_EMPTY) private List<CategoryEntity> childrenCategories; }
复制
在实体类的这个字段childrenCategories上加上注解@JsonInclude(JsonInclude.Include.NON_EMPTY) 问题就解决了。
该注解的作用就是:如果 childrenCategories 的值是空数组,就不返回
来看下加上注解后的效果吧:
仔细观察此时三级部门后面是没有 > 箭头的,此时问题就解决了。
那么还有一个注解 @JsonIgnore它和@JsonInclude有什么区别呢。
其实也很简单,前者是该字段的值为空则不返回字段给前端,前端都拿不到该字段自然也不会有数据;
后者是该字段可能为一个递归的数据,也就是说,本身字段是有数据的,但字段里面的数据所包含的数据可能为空
递归数据也就是List<CategoryEntity>,该字段的list集合中存放了0或多个对象,所以在层级数据的最后一层后面没有层级数据的时候就要使用@JsonInclude注解不给前端返回。
下面是查找递归数据:
public List<CategoryEntity> listTree() { // 所有的层级(分类)信息 List<CategoryEntity> entities = baseMapper.selectList(null); List<CategoryEntity> categoryTree = entities.stream().filter(categoryEntity -> { // 选出第一级分类信息 return categoryEntity.getParentId() == 0; }).map(category -> { // 找出一级分类下面的子分类信息 category.setChildrenCategories(getChildrenCategories(category, entities)); return category; }).sorted((category1, category2) -> { // 根据sort值排序 return (category1.getSort() == null ? 0 : category1.getSort()) - (category2.getSort() == null ? 0 : category2.getSort()); }).collect(Collectors.toList()); return categoryTree; }
复制
/** * 递归查找所有分类的分类 * @param root 根信息 * @param all 所有层级(分类)信息 * @return */ private List<CategoryEntity> getChildrenCategories (CategoryEntity root, List<CategoryEntity> all) { List<CategoryEntity> children = all.stream().filter(categoryEntity -> { return categoryEntity.getParentId() == root.getId(); }).map(categoryEntity -> { //1、找到子菜单(分类)信息, 并设置 这里是递归操作,表示查出所有子分类下面的分类信息,如果子分类下面的信息还有分类也要找出。 递归操作如果第一次接触可能理解稍难,多看看就好了! categoryEntity.setChildrenCategories(getChildrenCategories(categoryEntity, all)); return categoryEntity; }).sorted((category1, category2) -> { return (category1.getSort() == null ? 0 : category1.getSort()) - (category2.getSort() == null ? 0 : category2.getSort()); }).collect(Collectors.toList()); return children; }
复制