"不满意的依赖关系"将@Stateless注入托管bean

时间:2014-07-16 21:19:58

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

我的问题与WELD-001408 Unsatisfied dependencies when injecting EntityManagerWELD-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应该自己注册,但是找不到它。

3 个答案:

答案 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。