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
相关产品推荐
相关产品推荐

