Jakarta ee EntityManager在ejb容器中的Pojo类内为null

Jakarta ee EntityManager在ejb容器中的Pojo类内为null,jakarta-ee,jpa,ejb,entitymanager,Jakarta Ee,Jpa,Ejb,Entitymanager,我在netbeans中有一个javaweb服务模块和ejb模块(都是企业应用程序的一部分)。web服务正在使用@ejb注入使用ejb类。 在ejb模块内部,我有一个TransactionManager类,它不是企业bean。只是一堂POJO课。我正在尝试使用 @PersistanceContext(unitName = "testPU") EntityManager em; 但是em总是空的。 我通过bean从调用TransactionManager类,如果我在bean类中声明

我在netbeans中有一个javaweb服务模块和ejb模块(都是企业应用程序的一部分)。web服务正在使用@ejb注入使用ejb类。 在ejb模块内部,我有一个TransactionManager类,它不是企业bean。只是一堂POJO课。我正在尝试使用

    @PersistanceContext(unitName = "testPU")
    EntityManager em;
但是em总是空的。 我通过bean从调用TransactionManager类,如果我在bean类中声明EntityManager声明,它将在bean类中注入。但在POJO中,它总是空的

我是EJB新手(使用版本JEE7)。你能指引我吗

对Shailendra的答复: 我的bean和pojo在同一个jar文件中,它有bean.xml和persistence.xml。
我尝试使用@Stateless和@Local将TransactionManager类设置为bean,但是在ejb类和TransactionManager类之间有一些pojo类,当我尝试使用从其父pojo类访问TransactionManager类时 @EJB TransactionManager TransactionManager; 此对象也返回null

亲爱的Shilendra,谢谢你的回复 下面是我的EJB类

    @Stateless
    @Local(IMyService.class)
    public class MyService extends MyBase implements IMyService
    {
        MyComponent component = null;
        public void doSomething(X x)
        {
             component = new MyComponent();
             component.doSomething(x);
        }
    }
我有一个POJO类作为MyComponent

    public class MyComponent extends MyBase implements IMyComponent
    {
        TransactionManager tManager = null;
        public void doSomething(X x)
        {
            tManager = new TransactionManager();
            tManager.doSomething(x);
        }
    }
TransactionManager类是我希望为PersistenceContext执行依赖项注入的类

    public class TransactionManager extends MyBase implements ITransactionManager
    {
          @PersistenceContext(unitName="TestPU")
          EntityManager em;
          public void doSomething(X x)
          {
               em.persist(x);
          }
     }

POJO不由容器管理。而bean由容器管理&负责注入资源


您可以尝试JNDI查找来查找容器不负责的非托管自定义类的资源。

原因是您的POJO不受容器管理。如果您的容器支持CDI(上下文依赖注入),则在bean存档中声明您的bean(在META-INF或WEB-INF中具有beans.xml)以便进行管理。

您应该使用@Inject注释,而不是使用新操作符创建实例

  • 创建
    \WEB-INF\beans.xml
    (Netbeans中有一个向导)并设置
    bean发现模式=“全部”

  • 这是您的“MyService”的代码:您的还是我的?:-)

  • 这是您的“MyComponent”:-)


  • 嗨,你能给我一个电话吗sample@vilsad我不太喜欢CDI,你可以试试
    @injectentitymanager
    看看它是否有效。你能发布相关的类结构吗?我发布了关于这个问题的tge相关代码,在搜索时,我得到了一个谣言,说这个问题是GlassFish特有的(一些搜索指向这个方向)。但我无法用另一台服务器测试它,因为我找不到与JEE7兼容的服务器(Tomcat/JBoss)。我试图通过在类顶部声明中添加(at)无状态,在接口顶部声明中添加(at)本地,使TransactionManager类成为bean。然后通过注入(at)PersistenceUnit获得EntityManagerFactory。但这也返回了null;请你接受这个答案好吗?只需单击答案旁边的灰色复选标记。
     @Stateless
     @Local(IMyService.class)
     public class MyService extends MyBase implements IMyService {
    
         @Inject
         private MyComponent component;
    
         public void doSomething(X x)
         {
              component = new MyComponent();
              component.doSomething(x);
         }
     }
    
    public class MyComponent extends MyBase implements IMyComponent
    {
        @Inject 
        private TransactionManager tManager;
    
        public void doSomething(X x)
        {
            tManager = new TransactionManager();
            tManager.doSomething(x);
        }
    }