Spring Boot中UnsatisfiedDependencyException异常排查求助
异常解决建议
核心问题定位
异常明确说明:Spring容器中找不到FlightRepositoryImpl类型的bean,无法注入到FlightServiceImpl的构造方法中。根源是上下文扫描范围错误、组件未标记Spring注解、业务代码注解误用这三点。
具体修复步骤
1. 合并Spring上下文,避免重复创建
你同时启动了两个独立的Spring容器(SpringApplication.run() + AnnotationConfigApplicationContext),完全没必要。直接使用Spring Boot启动后的上下文即可:
package com.tbonegames.AirlineFlightManager; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; import com.tbonegames.services.FlightServiceImpl; @SpringBootApplication(scanBasePackages = "com.tbonegames") // 扫描项目所有子包 public class AirlineFlightManagerApplication { public static void main(String[] args) { ApplicationContext context = SpringApplication.run(AirlineFlightManagerApplication.class, args); FlightServiceImpl fsi = context.getBean(FlightServiceImpl.class); fsi.addFlight("1004", "American Airlines", "Chicago", "Miami", 125.00, 3); } }
scanBasePackages = "com.tbonegames"确保services、repository、flights等所有子包都被Spring扫描到。
2. 给FlightRepositoryImpl添加Spring组件注解
在FlightRepositoryImpl类上添加@Repository注解,让Spring识别并将其注册为容器内的bean:
package com.tbonegames.repository; import com.tbonegames.flights.Flight; import org.springframework.stereotype.Repository; import java.util.HashMap; import java.util.Map; @Repository // 标记为数据访问层组件 public class FlightRepositoryImpl { private Map<String, Flight> flightMap = new HashMap<>(); public void store(Flight flight) { flightMap.put(flight.getFlightId(), flight); } public Flight search(String flightId) { return flightMap.get(flightId); } // 其他CRUD方法按需补充 }
3. 修正FlightServiceImpl的注解与代码问题
(1)移除错误的@Bean注解
@Bean仅用于配置类中声明bean,不能加在业务方法上,直接删除所有方法上的@Bean;
(2)用@Service替代@Component(语义更明确);
(3)避免继承实体类Flight,业务服务类应依赖实体而非继承;
(4)构造方法注入保持简洁(Spring 4.3+可省略@Autowired,保留也可)。
修正后的FlightServiceImpl:
package com.tbonegames.services; import com.tbonegames.flights.Flight; import com.tbonegames.repository.FlightRepositoryImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; @Service // 语义化的服务层注解 public class FlightServiceImpl implements FlightService { private final FlightRepositoryImpl fri; private ArrayList<Flight> flightList = new ArrayList<>(); @Autowired public FlightServiceImpl(FlightRepositoryImpl fri) { this.fri = fri; } @Override public String generateFlightID(String flightId) { String currentFlight = flightId; if (flightId == null) { currentFlight = "1001"; } else { int in = 1001; for (Flight f : flightList) { int tempInt = Integer.parseInt(f.getFlightId()); if (in == tempInt) { in++; } } currentFlight = String.valueOf(in); } return currentFlight; } @Override public void addFlight(String flightId, String airlines, String source, String destination, Double fare, Integer seatCount) { Flight flight = new Flight(); flight.setFlightId(generateFlightID(flightId)); flight.setAirlines(airlines); flight.setSource(source); flight.setDestination(destination); flight.setFare(fare); flight.setSeatCount(seatCount); flightList.add(flight); fri.store(flight); // 存入模拟数据库Map } public void searchFlight(String flightInfo) { fri.search(flightInfo); } // 其他CRUD方法按需实现 }
4. 确认FlightService接口定义
确保FlightService接口存在并声明对应方法:
package com.tbonegames.services; public interface FlightService { String generateFlightID(String flightId); void addFlight(String flightId, String airlines, String source, String destination, Double fare, Integer seatCount); // 其他方法声明按需补充 }
验证修复效果
启动应用后,Spring会自动扫描所有标记了注解的组件,FlightServiceImpl的构造方法能成功注入FlightRepositoryImpl,调用addFlight方法后数据会存入FlightRepositoryImpl的Map中,实现模拟CRUD操作。
内容的提问来源于stack exchange,提问作者TylerBalaskovitz
相关产品推荐
相关产品推荐

