当前位置: 首页 > 知识库问答 >
问题:

如何将EJB注入抽象CDI类?

夏朝
2023-03-14

我有一个问题是将EJB注入到抽象类中,抽象类是我JSF CDI bean的父类。在我的项目中,我使用MyFaces CODI 1.0.5(ViewScope),Omniface 1.3,PrimeFaces 3.4.2和GlassFish3.1.2。

应用程序是一个EAR,抽象类位于EJB模块中,JSF CDI bean位于WAR模块中:

webframework-demo.ear
|__ webframework-war.war -> concrete JSF CDI bean
|__ webframework-ejb-lib.jar -> abstract class with EJB injection
|__ lib\
    |__ shared libs

我的抽象类:

public abstract class AbstractListPageAction<T extends AbstractViewBean<K>, K extends Serializable> {

    ...

    @EJB
    private CriteriaFacadeLocal<K> facade;

    @PostConstruct
    public void create() {
        ...

        facade.setEntityClass(getEntityClass());
        ...
    }

    ...

    public abstract Class<K> getEntityClass();

}

我的CDIBean:

import org.apache.myfaces.extensions.cdi.core.api.scope.conversation.ViewAccessScoped;

@Named
@ViewAccessScoped
public class UserListAction extends AbstractListPageAction<UserViewBean, UserEntity>
        implements Serializable {

    private static final long serialVersionUID = -1178878323047991855L;

    ...

    @Override
    public Class<UserEntity> getEntityClass() {
        return UserEntity.class;
    }

    ...
}

当我部署应用程序并访问JSF页面时,会创建UserListAction,但不会注入CriteriaFacadeLocal,并且在@PostConstruct方法中以NullPointerException结束。

当我更改UserListAction并添加一个空的@PostConstruct方法时,CriteriaFacade被注入,一切正常:

@Named
@ViewAccessScoped
public class UserListAction extends AbstractListPageAction<UserViewBean, UserEntity>
        implements Serializable {

    private static final long serialVersionUID = -1178878323047991855L;

    ...

    @PostConstruct
    public void init() {
    }

    @Override
    public Class<UserEntity> getEntityClass() {
        return UserEntity.class;
    }

    ...
}

我在每个模块都beans.xml。但是为什么我的CDI bean中必须有一个空的@PostConstruct方法呢?在EJB模块中放置抽象类有问题吗?

共有2个答案

孟海
2023-03-14

我从编辑过的问题中创建了答案:

我认为这可能是EAR/EAR模块类加载器的问题。我将webframework-ejb-lib.jar移到webframework-war.warWEB-INF/lib文件夹:

webframework-demo.ear
|__ webframework-war.war -> concrete JSF CDI bean
|   |__ WEB-INF
|       |__lib
|          |__ webframework-ejb-lib.jar -> abstract class with EJB injection
|__ ... (other ejb modules)
|__ lib\
    |__ shared libs

突然间一切都好了。

齐泰
2023-03-14

在EJB中使用泛型可能会有一些问题。

请参见EJB3.1中泛型的使用。

或者,您可以在层次结构中创建一个合格的EJB。参见javax。注射合格者

 类似资料:
  • CDI bean: 当我现在访问无状态EJB(例如从servlet访问)时,我希望testMethod使用与调用方的HttpSession相关联的CDI bean。因此,如果来自不同Browser/HTTP会话的两个客户机访问Servlet,它们都将得到不同的结果字符串。 我是否需要CDI而不是?如果需要,我如何为给定会话生成正确的bean实例?我想过也许可以使用BeanManager并搜索Ses

  • 问题内容: 我可以将自己的POJO注入到托管对象中,如下所示: 我有这个POJO: 这很好。如果将EJB注入到JSF支持bean中,则可以看到,按预期,该值是非null值。 但是,如果我尝试注入到,我得到部署以下异常: SomeEjb现在: Date有一个公开的,无参数的构造函数,我认为CDI只需“满足依赖性”即可。我确信这种行为是“符合规格”的,但是显然我对CDI的理解还存在很大的漏洞。 有人可

  • 我想让CDI“选择”一个替代类作为接口的实现。 虽然一切都捆绑在EAR中,但是替代实现将在war文件中,其余的(注入接口的类、接口、接口的“默认”实现)将在ejb jar中。 下面是一些代码来说明: EJB 模块: 战争模块: 在战争文件中设置豆子.xml没有帮助。

  • 将遗留项目迁移到雅加达 EE 8(在 Wildly 26 上构建 Maven EAR)我正在努力使依赖项注入从我的实体模块(EJB 打包)工作到 WAR 模块,maven 项目结构是: 该结构是基于Wildfly-jakartaee8-with-tools原型创建的 我要注入的DAO是一个@Stateless豆,它使用@LocalBean无接口例如。 我的 CDI 代码是 WAR 模块中的标准@R

  • 总结一下我失败的项目:我的类与bean一起打包在一个WAR中。xml文件。我的WAR反过来被打包在一个EAR中,这个EAR文件被部署到内部使用Tyrus的GlassFish 4服务器上。 WebSocket规范说: 在JavaEE平台中运行的WebSocketendpoint必须具有CDI规范中描述的完全依赖注入支持。WebSocket实现JavaEE平台的一部分需要支持字段、方法和构造函数注入,

  • 我有几个EJB3。x无状态会话bean,未定义接口。我需要将这些bean注入到Springbean中,但我无法这样做。 无接口EJB: 我的豆子: 还有我的豆子。xml 在初始化Spring容器时,我得到以下错误: 异常本身非常清楚——spring容器期望MyBean有一个本地接口视图作为其业务接口;但是,我没有(也不能介绍)。 非常感谢您的帮助!