You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过循环优化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 15:50:20