Quarkus中UnsatisfiedResolutionException依赖注入问题求助
Quarkus依赖注入错误排查:UnsatisfiedResolutionException
错误信息
Caused by: javax.enterprise.inject.spi.DeploymentException: javax.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type ai.govi.telemetry.service.DeviceResourceService and qualifiers [@Default] - java member: ai.govi.telemetry.web.DeviceResource():deviceResourceService - declared on CLASS bean [types=[java.lang.Object, ai.govi.telemetry.web.DeviceResource], qualifiers=[@Default, @Any], target=ai.govi.telemetry.web.DeviceResource]
问题根源
Quarkus的CDI上下文无法找到DeviceResourceService接口的实现类实例,因为DeviceResourceServiceImpl未被标记为CDI管理的Bean,导致容器无法识别并注入到DeviceResource中。
解决方案
1. 为实现类添加CDI作用域注解
在DeviceResourceServiceImpl类上添加@ApplicationScoped(或@Singleton等合适的作用域注解),让CDI容器管理该类的实例。
2. 修正构造器配置
将DeviceResourceServiceImpl的私有构造器改为public,并添加@Inject注解,确保CDI能正确注入DeviceRepository依赖。
修正后的DeviceResourceServiceImpl代码
package ai.govi.telemetry.service; import ai.govi.telemetry.domain.Device; import ai.govi.telemetry.dto.DeviceDTO; import ai.govi.telemetry.infrastructure.data.DeviceRepository; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import java.util.Date; import java.util.Map; import java.util.function.Predicate; @ApplicationScoped public class DeviceResourceServiceImpl implements DeviceResourceService { private final DeviceRepository deviceRepository; @Inject public DeviceResourceServiceImpl(DeviceRepository deviceRepository) { this.deviceRepository = deviceRepository; } @Override public Device searchDevice(DeviceDTO deviceDTO) { Integer id = deviceDTO.getDeviceId(); String deviceRef = deviceDTO.getDeviceName(); String deviceAlias = deviceDTO.getDeviceAlias(); Date createdAt = deviceDTO.getCreatedAt(); Date updatedAt = deviceDTO.getUpdatedAt(); Map<String, String> metadata = deviceDTO.getMetadata(); Predicate<Device> byDeviceId = id != null ? data -> data.getDeviceId().equals(id) : data -> true; Predicate<Device> byDeviceName = deviceRef != null ? data -> data.getDeviceName().equals(deviceRef) : data -> true; Predicate<Device> byDeviceAlias = deviceAlias != null ? data -> data.getDeviceAlias().equals(deviceAlias) : data -> true; Predicate<Device> byCreatedDate = createdAt != null ? data -> data.getCreatedAt().equals(createdAt) : data -> true; Predicate<Device> byUpdatedDate = updatedAt != null ? data -> data.getUpdatedAt().equals(updatedAt) : data -> true; Predicate<Device> byMetaData = metadata != null ? data -> data.getMetadata().equals(metadata) : data -> true; // 修正:通过findFirst()获取单个结果,避免强转报错 return deviceRepository .listAll() .stream() .filter(byDeviceId .and(byDeviceName) .and(byDeviceAlias) .and(byCreatedDate) .and(byUpdatedDate) .and(byMetaData)) .findFirst() .orElse(null); } }
额外注意点
- 原代码中直接对
Stream强转Device会报错,需用findFirst().orElse(null)获取单个实例。 - 检查
DeviceRepository是否同样被CDI管理(如添加@ApplicationScoped或Quarkus专属的@PanacheRepository注解),否则会触发新的依赖注入错误。 - 端点代码中
@POST方法的日志标注为GET,且@Path("device/{search}")中的{search}参数未被使用,可根据实际需求调整。
内容的提问来源于stack exchange,提问作者Vidushika Dasanayka
相关产品推荐
相关产品推荐

