3.5 KiB
根因
TeainfoController.convertToTeaInfoVO(TeainfoController.java:84-86)检查 teacher.getGroupList(),但它是一个 @Transient 字段,而 getSchTeacherList 查询链路(SchTeacherCacheService.java:36-44)只查 sch_teacher 本表、从不填充它。因此每个教师都在第 86 行 return null,stream().map() 不过滤 null,接口最终返回 200 OK + [null, null, ...]。GetTeainfo 和 GetArrTeainfo 共用同一转换方法,有一模一样的 bug。
修复方案
改动 1:TeainfoController.java(修复 null 元素)
-
注入
SchTeacherGroupRepository(新增@Autowired字段 + import:SchTeacherGroupRepository、java.util.Map、java.util.Collections、java.util.Objects)。 -
新增私有方法
fillGroupList(List<SchTeacher> teachers, Integer schId):批量查询组关系并回填到每个教师的@Transient groupList字段,复用项目既有模式(SchTeacherService.java:96-98 的findByTeaIdIn+groupingBy):
private void fillGroupList(List<SchTeacher> teachers, Integer schId) {
if (teachers == null || teachers.isEmpty()) return;
List<Integer> teaIds = teachers.stream()
.map(SchTeacher::getTeaId)
.filter(Objects::nonNull)
.collect(Collectors.toList());
if (teaIds.isEmpty()) return;
List<SchTeacherGroup> relations = (schId != null)
? schTeacherGroupRepository.findByTeaIdInAndSchId(teaIds, schId)
: schTeacherGroupRepository.findByTeaIdIn(teaIds);
Map<Integer, List<SchTeacherGroup>> groupMap = relations.stream()
.filter(g -> g.getTeaId() != null)
.collect(Collectors.groupingBy(SchTeacherGroup::getTeaId));
teachers.forEach(t -> t.setGroupList(groupMap.getOrDefault(t.getTeaId(), Collections.emptyList())));
}
- 三个接口调用处:
getSchTeainfo(:143-147):查询后调用fillGroupList(teachers, resolvedSchId)(按学校过滤组关系,保证 GroupID/SchSerID 取的是本校分组),流上加.filter(Objects::nonNull)兜底。getArrTeainfo(:107-110):调用fillGroupList(teachers, null)(无学校上下文,按教师ID查全部分组),流上加.filter(Objects::nonNull)。getTeainfo(:52-55):Optional.map内对单个教师调用fillGroupList(Collections.singletonList(teacher), null)(Java 8,不用List.of)。
改动 2:TeaInfoVO.java(锁定 JSON 键名)
每个字段加 @JsonProperty("原始字段名")(如 @JsonProperty("SchSerID") private String SchSerID;),与同包 SchInfoVO 的写法一致,确保输出键名为 SchSerID/TeaIDCard/GroupID 等原始大写形式,而不是 Jackson 默认推导的 schSerID/teaIDCard。新增 import com.fasterxml.jackson.annotation.JsonProperty。
保持现状(不在本次范围)
TeaNo映射的是sort排序号、其余 12 个字段(SchName、Photo 等)从不赋值恒为 null —— 属于字段映射契约问题,另行确认。findTeaIdsBySchId不过滤transfer_status(已转出教师也会出现在列表中)—— 与其他接口口径不一致,保持现状。- 文件中历史遗留的乱码注释不动;新增代码 UTF-8 + CRLF 与文件一致。
验证
mvn -q compile编译通过。- 如有条件,本地起服务后请求
/oapi/OATea/GetSchTeainfo?schId=xxx,确认返回教师数组(元素为对象而非 null,且键名为原始大写形式)。