Java EE 6注入抽象类

时间:2012-05-02 00:04:47

标签: java-ee glassfish ejb-3.1

在我正在研究的Java EE 6项目中,有一个用@EJB注释的字段没有被注入。注射在其他任何地方都能正常工作。

作为Java EE的新手,我不知道它是否与抽象类中的字段有关,也不能从Glassfish(3.1.2)中找到关于为什么没有发生这种注入的任何输出。

在发生NullPointerException之前,服务器日志中没有错误或警告,因为dataSourceControl字段为null。我已经验证了DataSourceControl Singleton是通过在其构造函数中放入日志来实例化的。

据我所知,dataSourceControl字段没有被注入,但是日志没有给我原因。

public abstract class AbstractDataMap<T> {
  @EJB
  private DataSourceControl dataSourceControl; // This is not being injected

  DataSourceControl getDataSourceControl() {
    return dataSourceControl;
  }
  // Other methods
}

public abstract class AbstractDataMapDBProd<T> extends AbstractDataMap<T> {
  @Override
  protected Connection getDBConnection() {
    return getDataSourceControl().getConnectionX(); // NullPointerException here
  }
  // Other methods
}

@Stateless
public class CountryMap extends AbstractDataMapDBProd<Country> {
  public boolean update(final Country current, final Country legacy) {
    Connection connection = getDBConnection();
    // More code 'n stuff
  }
}

我是否有任何关于在抽象类中定义的注射错过的规则?

还有其他任何叫'noob'的人吗?

如果没有明显的错误,有关于如何调试的任何想法吗?

2 个答案:

答案 0 :(得分:11)

注入将在任何类(基类,超类,抽象超类等)中起作用。但是,只有从容器中获取CountryMap的实例(即注入或查找)而不是通过new CountryMap,注入才会起作用。您如何获得CountryMap的实例?

答案 1 :(得分:0)

  

注射在其他任何地方都能正常工作。

由于容器负责在托管类中注入,因此@EJB注释不适用于抽象类。您必须通过JNDI手动查找EJB。