我的问题与WELD-001408 Unsatisfied dependencies when injecting EntityManager和WELD-001408 Unsatisfied dependencies不同。虽然这些问题涉及尝试将托管bean注入无状态EJB,但我正在尝试反过来。
尝试将@Stateless @Local interfaced bean注入Web托管bean时,我得到了“不满意的依赖项”。我正在构建一个包含各种EJB模块和Web模块的EAR,在JDK 8上运行 Glassfish 4 build 89 。以下是错误和项目配置的详细信息。
首先,这是错误:
SEVERE: Exception while loading the app
SEVERE: Undeployment failed for context /platform-app
SEVERE: Exception while loading the app : CDI deployment failure:WELD-001408 Unsatisfied dependencies for type [SessionSettingsBeanLocal] with qualifiers [@MyClient] at injection point [[BackedAnnotatedField] @Inject @MyClient private com.comp.jsf.dropdown.Settings.settingsBean]
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [SessionSettingsBeanLocal] with qualifiers [@MyClient] at injection point [[BackedAnnotatedField] @Inject @MyClient private com.comp.jsf.dropdown.Settings.settingsBean]
自定义限定符(在库项目中):
@Documented
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})
public @interface MyClient
EJB接口(在库项目中):
@Local
public interface SessionSettingsBeanLocal
EJB实现(在EJB模块项目中):
@Stateless
@MyClient
public class SessionSettingsBean implements SessionSettingsBeanLocal
托管bean(在web项目中 - 用于JSF):
@Named
@javax.faces.view.ViewScoped
public class Settings implements Serializable {
@Inject
@MyClient
private SessionSettingsBeanLocal settingsBean;
最后,我的所有beans.xml文件(EJB模块,Web)如下所示。包含接口和限定符的库没有beans.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="annotated">
</beans>
@Stateless EJB应该自己注册,但是找不到它。
答案 0 :(得分:1)
尝试将带注释的bean发现模式更改为全部
答案 1 :(得分:0)
CDI限定符仅适用于CDI bean。当然,您可以注入EJB依赖项,但不要混合使用CDI限定符。
如果您想使用限定符,这里是Arjan Tijms的一个很好的解决方法。 link
更新:
299规范确实提到了EJB集成。它们提供了299和EJB注释的示例,这意味着该bean将是CDI和EJB可注入的。这是样本:
@Stateful @SessionScoped @Model
public class Login {
@Inject Credentials credentials;
@Inject @Users EntityManager userDatabase;
...
private User user;
@Inject
void initQuery(@Users EntityManagerFactory emf) {
...
}
@TransactionAttribute(REQUIRES_NEW)
@RolesAllowed("guest")
public void login() {
...
}
public void logout() {
user = null;
}
public boolean isLoggedIn() {
return user!=null;
}
@RolesAllowed("user")
@Produces @LoggedIn User getCurrentUser() {
...
}
}
因此,您可能需要为SessionSettingsBean分配范围。
答案 2 :(得分:0)
你基本上有三个选择如何克服这个
完全切换到CDI
从CDI 1.1开始,你也可以在bean中使用事务,这样如果你没有使用远程EJB,MDB或其他任何EJB特定的东西,那么这就好了。
使用另一个EJB的限定符生成EJB
@Stateless
public class EJBProducer {
@EJB
private SessionSettingsBeanLocal settingsBean;
@Produces
@MyClient
public SessionSettingsBeanLocal getSettingsBean() {
return settingsBean;
}
}
请注意,此类必须位于WAR模块中。现在,您可以通过限定符将此EJB正常注入CDI bean。
根据JNDI名称区分EJB bean
@Stateless
public class SessionSettingsBean implements SessionSettingsBeanLocal {}
而不仅仅是将其注入类
@EJB(name = "SessionSettingsBean")
private SessionSettingsBeanLocal bean;
这样你可以避免任何CDI。