0

我有一个 Java Web 服务模块和 netbeans 中的 ejb 模块(企业应用程序的所有部分)。Web 服务正在使用 @EJB 注入来使用 ejb 类。在 ejb 模块中,我有一个不是企业 bean 的 TransactionManager 类。只是一个 POJO 类。我正在尝试使用注入 EntityManager

    @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 类,当我尝试使用@EJB 从其父pojo 类访问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);
          }
     }
4

3 回答 3

1

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

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

于 2013-10-16T08:53:17.730 回答
1

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

于 2013-10-16T08:58:11.237 回答
0

您应该使用 @Inject 注解而不是使用 new-operator 创建实例。

  1. 创建\WEB-INF\beans.xml(在 Netbeans 中有一个向导)并设置 bean-discovery-mode="all"

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

     @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);
         }
     }
    
  3. 这是你的“我的组件”:-)

    public class MyComponent extends MyBase implements IMyComponent
    {
        @Inject 
        private TransactionManager tManager;
    
        public void doSomething(X x)
        {
            tManager = new TransactionManager();
            tManager.doSomething(x);
        }
    }
    
于 2021-03-06T23:22:07.657 回答