如何通过循环优化Employee更新方法,替代大量if判断?
解决方案
一、Controller层参数校验优化
先在Controller完成基础参数校验,拦截无效请求:
@PutMapping(path = "/update") public ResponseEntity updateEmployee(@RequestParam("id") @NotNull(message = "员工ID不能为空") Long employeeId, @RequestParam("firstName") @NotBlank(message = "员工名不能为空") String firstName, @RequestBody @Valid Employee employeesDetails, BindingResult bindingResult) { // 处理参数校验错误 if (bindingResult.hasErrors()) { return ResponseEntity.badRequest().body(bindingResult.getAllErrors().stream() .map(ObjectError::getDefaultMessage) .collect(Collectors.joining("; "))); } Employee updatedEmployee = employeeService.updateByEmployeeIdAndFirstName(employeeId, firstName, employeesDetails); return ResponseEntity.ok(updatedEmployee); }
这里利用Spring的@NotNull、@NotBlank、@Valid注解实现参数校验,同时返回明确的错误提示。
二、服务层更新方法优化(反射循环实现)
通过反射遍历Employee类字段,自动判断非空值并赋值,替代冗余的if判断:
public Employee updateByEmployeeIdAndFirstName(Long employeeId, String firstName, Employee employeesDetails) { // 先校验查询结果,避免空指针 List<Employee> employeeList = employeeRepository.findByEmployeeIdAndFirstName(employeeId, firstName); if (employeeList.isEmpty()) { throw new RuntimeException("未找到对应员工"); } Employee updateEmployee = employeeList.get(0); // 遍历Employee类的所有字段 Field[] fields = Employee.class.getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); try { Object value = field.get(employeesDetails); // 仅当传入字段值不为null时,更新目标对象字段 if (value != null) { field.set(updateEmployee, value); } } catch (IllegalAccessException e) { e.printStackTrace(); throw new RuntimeException("更新员工信息失败"); } } employeeRepository.save(updateEmployee); return updateEmployee; }
注意事项
- 若
Employee类存在父类字段,需补充递归遍历父类字段的逻辑,比如通过Class.getSuperclass()获取父类并处理其字段。 - 对于
Job、Manager这类关联对象,若仅需更新关联ID而非整个对象,需单独判断处理,避免关联对象的非空属性被覆盖。
三、简洁替代方案:自定义BeanUtils忽略Null拷贝
如果不想手写反射循环,可借助Spring的BeanUtils实现忽略Null值的属性拷贝:
public Employee updateByEmployeeIdAndFirstName(Long employeeId, String firstName, Employee employeesDetails) { List<Employee> employeeList = employeeRepository.findByEmployeeIdAndFirstName(employeeId, firstName); if (employeeList.isEmpty()) { throw new RuntimeException("未找到对应员工"); } Employee updateEmployee = employeeList.get(0); // 仅拷贝非Null属性 BeanUtils.copyProperties(employeesDetails, updateEmployee, getNullPropertyNames(employeesDetails)); employeeRepository.save(updateEmployee); return updateEmployee; } // 获取所有值为Null的属性名,供BeanUtils忽略 private String[] getNullPropertyNames(Object source) { BeanWrapper src = new BeanWrapperImpl(source); PropertyDescriptor[] pds = src.getPropertyDescriptors(); Set<String> emptyNames = new HashSet<>(); for (PropertyDescriptor pd : pds) { Object srcValue = src.getPropertyValue(pd.getName()); if (srcValue == null) { emptyNames.add(pd.getName()); } } return emptyNames.toArray(new String[0]); }
内容的提问来源于stack exchange,提问作者Juan Kalyzta
相关产品推荐
相关产品推荐

