该注解可用于前端树形/层级数据的展示时,最后一层的数据点开以后为空的问题
这么说可能有点抽象,那么直接上图!
在这里三级部门后面是没有部门的。按说后面的层级应该不显示才对,可是三级部门后面还有一个 > ,点开以后确实红色框框这样什么都没有是空白的。
正常来说不应该再显示 >了,那么就不能展开,这才是正常的逻辑。那么该如何解决呢,答案就是:使用@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;
}