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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 16:40:04