如何将实现@Inject注入接口CDI

问题描述

我正在使用一个API(后端项目),该API使用一些包含共享源代码的公共/共享库。因此,我正在开发一项功能,该功能将添加到我们所有的后端中,这一切都是针对我的情况。

此API基于Jersey 2.x,Jackson,CDI 1.2,JPA,Hibernate等,已配置为部署在Weblogic 12c上,并且该项目已使用Maven创建。

因此,我正在研究一个简单的案例:我在适当的公共库(ref-common)(以确保我们的API实现相同的接口)中创建了一个“接口”,并在API中创建了实现(战争)。

接口(位于库中):

package be.company.ref.common.properties;

public interface ApplicationProperties {

    ...
}

实施(位于战争中):

package be.company.ref.appname.config;

import be.company.ref.common.properties.ApplicationProperties;
i...

public class ApplicationPropertiesImpl implements ApplicationProperties {
    ...
}

第二次,我基于dropwizard创建了一种healthCheck,它将用于我们所有的API(位于库中):

    package be.company.ref.common.healthcheck;

import be.company.ref.common.properties.ApplicationProperties;
import com.codahale.metrics.health.HealthCheck;
i...

/**
 * Performs a health check of an API.
 */
@ApplicationScoped
public class NomenclatureApiHealthCheck extends HealthCheck {

    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(NomenclatureApiHealthCheck.class);
    private WebTarget esbClient;
    private String serviceUrl;
    private static final String url = "/healthcheck";

    NomenclatureApiHealthCheck() {
    
    }

    @Inject
    NomenclatureApiHealthCheck(WebTarget esbClient,ApplicationProperties properties) {
        this.esbClient = esbClient;
        this.serviceUrl = properties.getServiceUrlNom();
    }


    @Override
    protected Result check() throws Exception {
        ...
    }
}

配置(位于API中)

package be.company.ref.appname.config;

import be.company.ref.common.healthcheck.DatabaseHealthCheck;
import be.company.ref.common.healthcheck.NomenclatureApiHealthCheck;
import com.codahale.metrics.health.HealthCheckRegistry;

import javax.annotation.PostConstruct;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.inject.Inject;

@Startup
@Singleton
public class HealthCheckConfiguration {
        
    @Inject
    HealthCheckRegistry registry;
        
    @Inject
    DatabaseHealthCheck databaseHealthCheck;
        
    @Inject
    NomenclatureApiHealthCheck nomenclatureApiHealthCheck;
        
    @PostConstruct
    public void configure() {
        registry.register(ComponentNames.DATABASE_APPNAME.name(),databaseHealthCheck);
        registry.register(ComponentNames.NOMENCLATURE_API.name(),nomenclatureApiHealthCheck);
    }
}

部署API时出现我的问题:

    25-sept.-2020 16 h 13 min 39 s,SSS CEST> <Error> <Deployer> <BEA-149231> <Unable to set the activation state to true for the application "ref-dimeco-front_war".
weblogic.management.DeploymentException: CDI deployment failure:WELD-001408: Unsatisfied dependencies for type ApplicationProperties with qualifiers @Default
  at injection point [BackedAnnotatedParameter] Parameter 2 of [BackedAnnotatedConstructor] @Inject be.company.ref.common.healthcheck.NomenclatureApiHealthCheck(WebTarget,ApplicationProperties)
  at be.company.ref.common.healthcheck.NomenclatureApiHealthCheck.<init>(NomenclatureApiHealthCheck.java:28)

    at com.oracle.injection.integration.CDIAppDeploymentExtension.initCdi(CDIAppDeploymentExtension.java:95)
    at com.oracle.injection.integration.CDIAppDeploymentExtension.activate(CDIAppDeploymentExtension.java:43)
    at weblogic.application.internal.flow.AppDeploymentExtensionFlow.activate(AppDeploymentExtensionFlow.java:39)
    at weblogic.application.internal.BaseDeployment$2.next(BaseDeployment.java:752)
    at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:45)
    Truncated. see log file for complete stacktrace
Caused By: org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type ApplicationProperties with qualifiers @Default
  at injection point [BackedAnnotatedParameter] Parameter 2 of [BackedAnnotatedConstructor] @Inject be.company.ref.common.healthcheck.NomenclatureApiHealthCheck(WebTarget,ApplicationProperties)
  at be.company.ref.common.healthcheck.NomenclatureApiHealthCheck.<init>(NomenclatureApiHealthCheck.java:28)

    at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:359)
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:281)
    at org.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:134)
    at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:155)
    at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:518)
    Truncated. see log file for complete stacktrace

API的pom.xml的提取(ref-common包含接口和运行状况检查):

<dependency>
    <groupId>be.company.ref.common</groupId>
    <artifactId>ref-common</artifactId>
    <version>${ref-common.version}</version>
</dependency>

基本上,该API与共享库打包在一起,并部署在weblo上。

考虑到这一点,我发布了不带@nnotation的“ ApplicationPropertiesImpl”,因为我尝试了@ApplicationScope和@Singleton,但是由于两者都不起作用,所以我尝试了不带任何@annotation的情况。

所以,您能解释一下为什么我不理解我的错误时为什么会在我部署API时发生此错误。

谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)