mirror of https://github.com/halo-dev/halo
refactor: avoid NPE caused by children field data problem (#2645)
#### What type of PR is this? /kind improvement /area core /milestone 2.0 #### What this PR does / why we need it: 菜单和分类数列表加强健壮性,防止因为 children 字段存在垃圾数据时导致 NPE 问题 #### Which issue(s) this PR fixes: a part of #2643 #### Special notes for your reviewer: how to test it? 1. 创建一个层级结构菜单,比如 ``` A |-B |-C ``` 2. 删除菜单 C 然后访问主题端首页不会发生以下异常信息 ``` Caused by: java.lang.NullPointerException: Cannot invoke "run.halo.app.theme.finders.vo.MenuItemVo.setParentName(String)" because "childNode" is null ``` /cc @halo-dev/sig-halo #### Does this PR introduce a user-facing change? ```release-note 修复获取菜单和分类列表时会出现 NPE 的问题 ```pull/2652/head^2
parent
c3a3281fcc
commit
1be6a07d96
|
@ -82,9 +82,12 @@ public class CategoryFinderImpl implements CategoryFinder {
|
||||||
|
|
||||||
nameIdentityMap.forEach((name, value) -> {
|
nameIdentityMap.forEach((name, value) -> {
|
||||||
List<String> children = value.getSpec().getChildren();
|
List<String> children = value.getSpec().getChildren();
|
||||||
if (children != null) {
|
if (children == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
for (String child : children) {
|
for (String child : children) {
|
||||||
CategoryTreeVo childNode = nameIdentityMap.get(child);
|
CategoryTreeVo childNode = nameIdentityMap.get(child);
|
||||||
|
if (childNode != null) {
|
||||||
childNode.setParentName(name);
|
childNode.setParentName(name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -127,9 +127,12 @@ public class MenuFinderImpl implements MenuFinder {
|
||||||
|
|
||||||
nameIdentityMap.forEach((name, value) -> {
|
nameIdentityMap.forEach((name, value) -> {
|
||||||
LinkedHashSet<String> children = value.getSpec().getChildren();
|
LinkedHashSet<String> children = value.getSpec().getChildren();
|
||||||
if (children != null) {
|
if (children == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
for (String child : children) {
|
for (String child : children) {
|
||||||
MenuItemVo childNode = nameIdentityMap.get(child);
|
MenuItemVo childNode = nameIdentityMap.get(child);
|
||||||
|
if (childNode != null) {
|
||||||
childNode.setParentName(name);
|
childNode.setParentName(name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -226,6 +226,7 @@ class CategoryFinderImplTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Category> moreCategories() {
|
private List<Category> moreCategories() {
|
||||||
|
// see also https://github.com/halo-dev/halo/issues/2643
|
||||||
String s = """
|
String s = """
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
|
@ -318,7 +319,8 @@ class CategoryFinderImplTest {
|
||||||
"bd95f914-22fc-4de5-afcc-a9ffba2f6401",
|
"bd95f914-22fc-4de5-afcc-a9ffba2f6401",
|
||||||
"e1150fd9-4512-453c-9186-f8de9c156c3d",
|
"e1150fd9-4512-453c-9186-f8de9c156c3d",
|
||||||
"acf09686-d5a7-4227-ba8c-3aeff063f12f",
|
"acf09686-d5a7-4227-ba8c-3aeff063f12f",
|
||||||
"ed064d5e-2b6f-4123-8114-78d0c6f2c4e2"
|
"ed064d5e-2b6f-4123-8114-78d0c6f2c4e2",
|
||||||
|
"non-existent-children-name"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"status":{
|
"status":{
|
||||||
|
|
|
@ -90,7 +90,7 @@ class MenuFinderImplTest {
|
||||||
Menu menuX = menu("X", of("G"));
|
Menu menuX = menu("X", of("G"));
|
||||||
Menu menuY = menu("Y", of("F"));
|
Menu menuY = menu("Y", of("F"));
|
||||||
|
|
||||||
MenuItem itemE = menuItem("E", of("A", "C"));
|
MenuItem itemE = menuItem("E", of("A", "C", "non-existent-children-name"));
|
||||||
MenuItem itemG = menuItem("G", null);
|
MenuItem itemG = menuItem("G", null);
|
||||||
MenuItem itemF = menuItem("F", of("H"));
|
MenuItem itemF = menuItem("F", of("H"));
|
||||||
MenuItem itemA = menuItem("A", of("B"));
|
MenuItem itemA = menuItem("A", of("B"));
|
||||||
|
|
Loading…
Reference in New Issue