如何解决如何将实现@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 举报,一经查实,本站将立刻删除。