【发布时间】:2023-03-29 01:25:02
【问题描述】:
我正在尝试使用 POJO 作为 CDI 生产者来注入正确的 EJB,但我得到 org.jboss.weld.exceptions.UnsatisfiedResolutionException: WELD-001308。
这是我的制作人 POJO
public class STGatewayUtilProducer {
@Produces
@Chosen
public ISTGatewayUtil getISTGatewayUtil(Instance<STGatewayWSUtil> ws, Instance<STGatewayMQTTUtil> mqtt, ConfigurationManager cm) {
switch(cm.getGatewayProtocol()) {
case ConfigurationManager.GATEWAY_PROTOCOL_TYPE_MQTT:
return mqtt.get();
default:
return ws.get();
}
}
}
这是限定符定义:
@Qualifier
@Target({ TYPE, METHOD, PARAMETER, FIELD })
@Retention(RUNTIME)
@Documented
public @interface Chosen {}
这些是 EJB 声明:
@Stateless
public class STGatewayMQTTUtil implements Serializable, ISTGatewayUtil {
...
}
@Stateless
public class STGatewayWSUtil implements Serializable, ISTGatewayUtil {
...
}
最后,这是我注入 EJB 的方式:
@Inject
@Chosen
private Instance<ISTGatewayUtil> gtwUtil;
我在使用 JBoss AS 7 和 WildFly 10 时都遇到了问题。
编辑
我找到了问题的核心!我声明了一个通用的 abstract 父类,它实现了 ejb 接口并让我的会话 bean 扩展它:使用这种结构无法解析 bean。
相反,如果我在会话 bean 上移动 implements 子句,问题就会消失:有人可以解释一下我的类层次结构有什么问题吗?
【问题讨论】:
-
@Produces和Instance不能很好地协同工作,请使用其中之一。为什么你需要Instance<ISTGatewayUtil> gtwUtil而不是ISTGatewayUtil gtwUtil? -
@Geinmachi 因为我希望它被延迟加载:这不是正确的做法吗?
标签: jakarta-ee jboss ejb cdi wildfly