html设计素材网站,淘宝不能发布网站开发了,天津网站建设兼职,东莞网站建设公司招聘信息完整的 FakeRegistrationController 代码#xff0c;这让我可以全面分析后端逻辑#xff0c;特别是为什么空的字段#xff08;如 compareDate#xff09;不返回给前端。我将详细分析代码的每个接口#xff0c;尤其是与 list 请求和字段返回相关的部分#xff0c;并解释原…完整的 FakeRegistrationController 代码这让我可以全面分析后端逻辑特别是为什么空的字段如 compareDate不返回给前端。我将详细分析代码的每个接口尤其是与 list 请求和字段返回相关的部分并解释原因。 代码结构总览
FakeRegistrationController 是一个 RESTful 控制器提供了三个接口
POST /fakeRegistration/registration/save保存或修改假货登记信息。POST /fakeRegistration/compare/save保存或修改比对结果。GET /fakeRegistration/list获取假货登记列表对应前端的 qlist 请求。
我们关心的是 list 接口因为它直接决定了前端表格接收到的数据内容特别是为何空的 compareDate 不返回。 详细分析 list 接口
接口定义
GetMapping(list)
ApiOperation(假货登记列表)
public BaseResult list(ApiIgnore SessionAttribute(Constants.ADMIN_ID) Integer adminId,BasePage page) {Integer vipAdminId copywritingApiService.getVipAdminId(adminId, 11);PageFakeRegistration fakeRegistrationPage fakeRegistrationService.findByAdminId(vipAdminId, page);ListFakeRegistration fakeRegistrations fakeRegistrationPage.getContent();ListFakeRegistrationListDTO fakeRegistrationListDTOS new ArrayList();for (FakeRegistration fakeRegistration: fakeRegistrations) {FakeRegistrationListDTO fakeRegistrationListDTO JSON.parseObject(JSON.toJSONString(fakeRegistration), FakeRegistrationListDTO.class);if (null ! fakeRegistration.getProductId()) {Product product productService.findById(fakeRegistration.getProductId()).orElseThrow(() - new RuntimeException(未找到商品信息));fakeRegistrationListDTO.setProductName(product.getName());}Admin creator adminService.findById(fakeRegistration.getCreatorId()).orElseThrow(() - new RuntimeException(未找到创建人信息));fakeRegistrationListDTO.setCreatorName(StringUtils.isEmpty(creator.getNickname()) ? creator.getUsername() : creator.getNickname());fakeRegistrationListDTO.setGenuineIdentificationPoints(fakeRegistrationApiService.findIdentification(fakeRegistration.getId(), 1));fakeRegistrationListDTO.setFakeIdentificationPoints(fakeRegistrationApiService.findIdentification(fakeRegistration.getId(), 0));fakeRegistrationListDTOS.add(fakeRegistrationListDTO);}return BaseResult.success(new PageImpl(fakeRegistrationListDTOS, PageRequest.of(fakeRegistrationPage.getNumber(), fakeRegistrationPage.getSize()), fakeRegistrationPage.getTotalElements()));
}数据流分析 数据查询 fakeRegistrationService.findByAdminId(vipAdminId, page) 返回一个 PageFakeRegistration其中 FakeRegistration 是数据库实体类包含所有字段如 id, createdDate, compareDate, comparisonStatus 等。fakeRegistrations 是分页内容的 ListFakeRegistration。 数据转换 每个 FakeRegistration 被转换为 FakeRegistrationListDTOFakeRegistrationListDTO fakeRegistrationListDTO JSON.parseObject(JSON.toJSONString(fakeRegistration), FakeRegistrationListDTO.class);这里使用了 FastJSONcom.alibaba.fastjson.JSON进行序列化和反序列化 JSON.toJSONString(fakeRegistration) 将 FakeRegistration 转为 JSON 字符串。JSON.parseObject(..., FakeRegistrationListDTO.class) 将 JSON 字符串转为 FakeRegistrationListDTO 对象。 然后手动补充了 productName从 ProductService 获取。creatorName从 AdminService 获取。genuineIdentificationPoints 和 fakeIdentificationPoints从 FakeRegistrationApiService 获取。 返回结果 返回一个 PageImplFakeRegistrationListDTO最终被序列化为 JSON 响应。
为什么空的字段如 compareDate不返回 FastJSON 的默认行为 FastJSON 在序列化时默认忽略 null 值字段除非显式配置 SerializerFeature.WriteMapNullValue。如果 FakeRegistration 的 compareDate 是 nullJSON.toJSONString(fakeRegistration) 生成的 JSON 字符串不会包含 compareDate。示例FakeRegistration fr new FakeRegistration();
fr.setId(34);
fr.setComparisonStatus(1);
fr.setCompareDate(null); // 为空
String json JSON.toJSONString(fr);
// 输出: {id:34,comparisonStatus:1}反序列化到 FakeRegistrationListDTO 时由于 JSON 中没有 compareDatefakeRegistrationListDTO 的 compareDate 字段不会被赋值最终返回的 JSON 也不会包含它。 业务逻辑 从其他接口看compareDate 只有在 compare/save 接口保存比对结果时才会设置fakeRegistrationOrigin.setCompareDate(new Date());在 registration/save 接口中新建记录时没有设置 compareDate它保持为 null。因此未完成比对的记录comparisonStatus 0 或 1在数据库中 compareDate 就是 NULL序列化后被忽略。 DTO 定义的影响 如果 FakeRegistrationListDTO 中定义了 compareDatepublic class FakeRegistrationListDTO {private Integer id;private Date compareDate; // 假设是这样// 其他字段
}当 JSON.parseObject 处理没有 compareDate 的 JSON 时fakeRegistrationListDTO.compareDate 会是 null但后续的序列化返回给前端时仍由 FastJSON 处理又会被忽略。 其他接口的补充分析
1. registration/save
PostMapping(registration/save)
public BaseResult save(RequestBody FakeRegistration fakeRegistration, ...) {if(null ! fakeRegistration.getId()) {FakeRegistration fakeRegistrationOrigin fakeRegistrationService.findById(fakeRegistration.getId()).orElseThrow(...);fakeRegistration SqlUtil.mergeObject(fakeRegistration, fakeRegistrationOrigin);if(null ! fakeRegistration.getCompareResult() fakeRegistration.getCompareResult() 1) {fakeRegistrationOrigin.setComparisonStatus(3);} else if(null ! fakeRegistration.getCompareResult() fakeRegistration.getCompareResult() 0) {fakeRegistrationOrigin.setComparisonStatus(2);}} else {fakeRegistration.setAdminId(vipAdminId);fakeRegistration.setCreatorId(adminId);}fakeRegistration fakeRegistrationService.save(fakeRegistration);...
}关键点 新建记录时fakeRegistration.getId() null只设置了 adminId 和 creatorId没有初始化 compareDate它默认为 null。修改记录时如果提供了 compareResult会更新 comparisonStatus但不会设置 compareDate。因此compareDate 在这个接口中始终不会被赋值。
2. compare/save
PostMapping(compare/save)
public BaseResult compareSave(RequestBody FakeRegistrationSaveDTO fakeRegistration, ...) {FakeRegistration fakeRegistrationOrigin fakeRegistrationService.findById(fakeRegistration.getId()).orElseThrow(...);fakeRegistrationOrigin.setCompareResult(fakeRegistration.getCompareResult());fakeRegistrationOrigin.setCompareDate(new Date());fakeRegistrationService.save(fakeRegistrationOrigin);...
}关键点 这里显式设置了 compareDate new Date()表示比对完成的时间。只有通过这个接口保存比对结果时compareDate 才会被赋值。这解释了前端数据中只有 comparisonStatus 2 或更高状态的记录有 compareDate。 综合结论为什么空的字段不返回 数据来源 compareDate 在数据库中默认为 NULL除非通过 compare/save 接口保存比对结果时才会被赋值。未完成比对的记录comparisonStatus 0 或 1没有 compareDate 值。 FastJSON 序列化 list 接口中JSON.toJSONString(fakeRegistration) 将 FakeRegistration 转为 JSON 时默认忽略 null 字段。如果 compareDate 是 null它不会出现在 JSON 字符串中。反序列化到 FakeRegistrationListDTO 后compareDate 仍未被赋值最终返回的 JSON 也不包含这个字段。 业务逻辑 设计上compareDate 只有在比对完成时才有意义未完成时保持 null 并被忽略是合理的。 最终返回 Spring Boot 的 RestController 使用 Jackson或其他配置将 PageImplFakeRegistrationListDTO 序列化为 JSON同样忽略 null 字段进一步确保空的 compareDate 不出现在响应中。
前端数据的验证
你的前端数据
id: 34, 33, 32comparisonStatus 0 或 1没有 compareDate因为未调用 compare/save。id: 31, 30, 28comparisonStatus 2有 compareDate因为通过 compare/save 设置了值。 改进建议
如果希望空的 compareDate 也返回例如 compareDate: null 修改 FastJSON 配置 FakeRegistrationListDTO fakeRegistrationListDTO JSON.parseObject(JSON.toJSONString(fakeRegistration, SerializerFeature.WriteMapNullValue),FakeRegistrationListDTO.class
);添加 WriteMapNullValue确保 null 字段被包含。 调整 DTO 在 FakeRegistrationListDTO 中显式处理fakeRegistrationListDTO.setCompareDate(fakeRegistration.getCompareDate() ! null ? fakeRegistration.getCompareDate() : null);全局配置 在 Spring Boot 中配置 JacksonBean
public ObjectMapper objectMapper() {ObjectMapper mapper new ObjectMapper();mapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);return mapper;
}总结
空的 compareDate 不返回给前端是因为
业务逻辑未完成比对时数据库中 compareDate 为 NULL。FastJSON 默认行为JSON.toJSONString 忽略 null 字段。设计选择后端选择不返回无意义的空字段。
这种行为是合理的但如果前端需要一致性可以通过上述方式调整后端返回。