【问题标题】:"Unsatisfied dependencies" injecting @Stateless into managed bean“不满足的依赖关系”将@Stateless 注入托管 bean
【发布时间】:2014-07-16 21:19:57
【问题描述】:

我的问题不同于WELD-001408 Unsatisfied dependencies when injecting EntityManagerWELD-001408 Unsatisfied dependencies。虽然这些问题涉及尝试将托管 bean 注入到无状态 EJB 中,但我正试图做相反的事情。

尝试将@Stateless @Local 接口 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 应该注册自己,但没有找到。

【问题讨论】:

标签: jakarta-ee ejb cdi glassfish-4 java-ee-7


【解决方案1】:

尝试将bean-discovery-mode从annotated改为all

【讨论】:

  • 考虑在您的答案中添加更多细节,以便其他人更容易理解
【解决方案2】:

你基本上有三种选择来克服这个

完全切换到 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。

【讨论】:

  • 我没有使用@EJB 注入注解。我正在使用 CDI 的 @Inject,正如许多 EE 开发人员所推荐的那样。甚至加文·金:seamframework.org/107780.lace
  • 当然,如果我是你,我会选择第一或第二,但我想你应该知道所有选项。
  • 好吧,我认为这可能是我的错误,但我不清楚何时可以接受注射。具有 EJB (SessionSettingsBeanLocal) 注入点的命名 bean (Settings) 实际上位于 JAR 中。现在,那些@Named @javax.faces.view.ViewScoped bean(即JSF 的托管bean)可以注入到WAR 和JAR bean 中,但是从EJB 包注册的EJB 对JAR 不可见。如果我将 JAR 包转换为 EJB,那么我的无状态 EJB 会被注入,但随后将 @Named @javax.faces.view.ViewScoped bean 注入同一包中的其他 bean 会失败。
【解决方案3】:

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 分配一个范围。

【讨论】:

    猜你喜欢
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    相关资源
    最近更新 更多