【发布时间】:2017-11-19 12:19:51
【问题描述】:
我有一个超类型 (CaseDTO),其中包含我想要注入的几个子类型 (GroupCaseDTO、IPCaseDTO)。开发环境为 JDev 12c。
这里是两个注入点:
-
注入超类型(此注入点适用于两种子类型):
@Inject @CaseContext 私人案例DTO muwCase;
-
注入特定的子类型(此注入点仅适用于一个子类型):
@Inject @CaseContext 私有 GroupCaseDTO muwCase;
为了获得这些值,我尝试设置了一些生产者方法:
// supertype
@Produces @CaseContext
public CaseDTO getContextCase() {
return JSFUtils.getFromPageFlowScope("case", CaseDTO.class);
}
// subtype 1
@Produces @CaseContext
public IPCaseDTO getContextIpCase() {
return JSFUtils.getFromPageFlowScope("case", IPCaseDTO.class);
}
// subtype 2
@Produces @CaseContext
public GroupCaseDTO getContextGroupCase() {
return JSFUtils.getFromPageFlowScope("case", GroupCaseDTO.class);
}
问题是,如果我只包含超类型生产者方法,那么子类型注入点不起作用:
:org.jboss.weld.exceptions.DeploymentException:WELD-001408: Unsatisfied dependencies for type GroupCaseDTO with qualifiers @CaseContext
at injection point [BackedAnnotatedField] @Inject @CaseContext private ca.bluecross.ab.muw.view.controller.decision.ManageGrpDecisionController.muwCase
at ca.bluecross.ab.muw.view.controller.decision.ManageGrpDecisionController.muwCase(ManageGrpDecisionController.java:0)
WELD-001475: The following beans match by type, but none have matching qualifiers:
- Managed Bean [class ca.bluecross.ab.muw.model.type.dto.grp.GroupCaseDTO] with qualifiers [@Any @Default]
但是如果我包含所有三个生产者方法,我会在超类型注入点上得到这个异常:
:org.jboss.weld.exceptions.DeploymentException:WELD-001409: Ambiguous dependencies for type CaseDTO with qualifiers @CaseContext
at injection point [BackedAnnotatedField] @Inject @CaseContext private ca.bluecross.ab.muw.view.controller.UploadAssociatedDocumentController.muwCase
at ca.bluecross.ab.muw.view.controller.UploadAssociatedDocumentController.muwCase(UploadAssociatedDocumentController.java:0)
Possible dependencies:
- Producer Method [CaseDTO] with qualifiers [@CaseContext @Any] declared as [[BackedAnnotatedMethod] @Produces @CaseContext public ca.bluecross.ab.muw.view.util.DataContextHelper.getContextCase()],
- Producer Method [GroupCaseDTO] with qualifiers [@CaseContext @Any] declared as [[BackedAnnotatedMethod] @Produces @CaseContext public ca.bluecross.ab.muw.view.util.DataContextHelper.getContextGroupCase()],
- Producer Method [IPCaseDTO] with qualifiers [@CaseContext @Any] declared as [[BackedAnnotatedMethod] @Produces @CaseContext public ca.bluecross.ab.muw.view.util.DataContextHelper.getContextIpCase()]
只有两个子类型生产者方法也不起作用:
:org.jboss.weld.exceptions.DeploymentException:WELD-001409: Ambiguous dependencies for type CaseDTO with qualifiers @CaseContext
at injection point [BackedAnnotatedField] @Inject @CaseContext private ca.bluecross.ab.muw.view.controller.UploadAssociatedDocumentController.muwCase
at ca.bluecross.ab.muw.view.controller.UploadAssociatedDocumentController.muwCase(UploadAssociatedDocumentController.java:0)
Possible dependencies:
- Producer Method [GroupCaseDTO] with qualifiers [@CaseContext @Any] declared as [[BackedAnnotatedMethod] @Produces @CaseContext public ca.bluecross.ab.muw.view.util.DataContextHelper.getContextGroupCase()],
- Producer Method [IPCaseDTO] with qualifiers [@CaseContext @Any] declared as [[BackedAnnotatedMethod] @Produces @CaseContext public ca.bluecross.ab.muw.view.util.DataContextHelper.getContextIpCase()]
我想我可以通过为我需要的每个子类型使用限定符注释来解决这个问题,但这似乎太过分了。如果没有大量限定符注释,就没有办法让注入工作吗?
事实上,这就是我想要的:一个生产者方法 + 一个限定符注释,它允许我注入上下文案例,而不管它是什么子类型。同样,我认为 CDI 不可能做到这一点,因为它(太)是强类型的。
【问题讨论】:
标签: java dependency-injection cdi jsf-2.2 oracle-adf