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

Spring Boot外观模式使用疑问及代码功能实现求助

外观模式核心要点与优势
  • 核心要点:定义一个统一的高层接口,封装多个子系统的复杂交互逻辑,让客户端只需和这个接口交互,无需了解子系统内部细节。
  • 使用原因:
    • 降低客户端与子系统的耦合度,客户端不用关心多个子系统的调用顺序和依赖关系
    • 简化客户端代码,把复杂的多步操作封装成一个接口调用
    • 隔离子系统变化,子系统内部修改不影响客户端调用方式

代码问题排查与修复

1. 服务类依赖注入缺失

EmployeeAddressService中的repository未注入,Spring无法实例化该Bean,导致后续调用失败:

@Service
public class EmployeeAddressService {
    private final EmployeeAddressRepository repository;

    // 构造方法注入(Spring推荐方式)
    public EmployeeAddressService(EmployeeAddressRepository repository) {
        this.repository = repository;
    }

    public List<EmployeeAddress> getallempbycityid(String cityid){
        return this.repository.findAllByAddress_City_Id(cityid);
    }
}

2. 外观类逻辑与语法错误

  • 返回值类型不匹配:方法声明返回List<EmployeeAddress>,但实际需返回姓氏列表List<String>
  • 存在语法错误:循环语句缺少分号、getLastName调用缺少括号
  • 空指针风险:未处理employeeService.findById()返回null的情况
  • 逻辑冗余:无需先收集Name再转换姓氏,可直接一步处理

修复后的外观类:

@Component
public class EmployeeAddressApi {
    private final EmployeeAddressService employeeAddressService;
    private final EmployeeService employeeService;

    @Autowired
    public EmployeeAddressApi(EmployeeAddressService employeeAddressService, EmployeeService employeeService) {
        this.employeeAddressService = employeeAddressService;
        this.employeeService = employeeService;
    }

    // 修改返回值为姓氏列表,明确方法语义
    public List<String> getEmployeeSurnamesByCityId(String cityId) {
        List<EmployeeAddress> empAddressList = employeeAddressService.getallempbycityid(cityId);
        if (empAddressList.isEmpty()) {
            return Collections.emptyList(); // 返回空列表而非null,避免空指针
        }

        List<String> surnames = new ArrayList<>();
        for (EmployeeAddress ea : empAddressList) {
            Employee employee = employeeService.findById(ea.getStaffId());
            // 空值判断,避免NPE
            if (employee != null && employee.getName() != null) {
                surnames.add(employee.getName().getLastName());
            }
        }
        return surnames;
    }
}

3. 控制器类返回值匹配与语法修复

控制器方法需与外观类返回值对应,同时修正语法错误:

@RestController
@RequestMapping("/employeeaddress")
public class EmployeeAddressController {
    private final EmployeeAddressApi employeeAddressApi;

    // 构造方法注入
    public EmployeeAddressController(EmployeeAddressApi employeeAddressApi) {
        this.employeeAddressApi = employeeAddressApi;
    }

    @GetMapping("/getempbycityid/{cityId}")
    public List<String> read(@PathVariable String cityId){
        return employeeAddressApi.getEmployeeSurnamesByCityId(cityId);
    }
}

4. 测试类语法与路径修正

修复测试方法的语法错误,同时调整请求路径与控制器路由匹配:

@Test
public void db_read() {
    String cityid = "cityid";
    String url = base_url + "/employeeaddress/getempbycityid/" + cityid;
    System.out.println("URL: " + url);
    HttpHeaders httpHeaders = new HttpHeaders();
    HttpEntity<String> entity = new HttpEntity<>(null, httpHeaders);
    ResponseEntity<List> response = restTemplate.exchange(url, HttpMethod.GET, entity, List.class);
    assertNotNull(response);
    System.out.println("City ID: " + cityid);
    System.out.println("Surnames: " + response.getBody());
}

内容的提问来源于stack exchange,提问作者Isgak Abzal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 01:50:19