如何在JavaEE(@Inject)中使用模拟@Autowired注释?

时间:2015-12-24 08:50:48

标签: java java-ee inject

在Spring项目中,我可以使用@Autowired注释。

@Service
public class DefaultUserService implements UserService {
...
        @Autowired
        private UserDao userDao;

但我不明白JavaEE项目是如何做到的。我找到了:

@注入 私人AvayaDao avayaDao;

但是我的avayaDao是NULL。我尝试添加注释

@Default
public class AvayaService {
...
@Inject
private AvayaDao avayaDao;

但没有帮助。它是我的Dao:

public interface AvayaDao extends BaseDao<AvayaSdr> {

    List<AvayaSdr> getAll();
    void insertCdr(AvayaSdr avayaSdr);
}

这是我的服务:

@Default
public class AvayaService {
    private static AvayaService instance;

    @Inject
    private AvayaDao avayaDao;

    public synchronized static AvayaService me() {
        if (instance == null) {
            instance = new AvayaService();
        }
        return instance;
    }

    public Set<String> selectAllLoadedAVAYAcmCDRFiles() {
        Set<String> result = new HashSet<>();
        List<AvayaSdr> resultList = avayaDao.getAll();
        for (AvayaSdr avayaSdr : resultList) {
            result.add(avayaSdr.getHashValue());
        }
        return result;
    }

    public void insertCdr(String fileHash) {
        AvayaSdr avayaCmCdr = new AvayaSdr("", fileHash, 0);
        avayaDao.insertCdr(avayaCmCdr);
    }

java.lang.NullPointerException

1 个答案:

答案 0 :(得分:1)

如果使用Java EE 6,AvayaDao必须是EJB并使用@Stateless或@Singleton注释,或者您使用CDI注入并且需要空的beans.xml文件(http://docs.oracle.com/javaee/6/tutorial/doc/gjbnz.html)。在Java EE中7必须设置属性bean-discovery-mode =“all”(https://docs.oracle.com/javaee/7/tutorial/cdi-adv001.htm)。

更新1:

Enterprise Java Beans是POJOS,注释为@Stateless@Statefull@Singleton,由应用程序服务器内的EJB容器管理。他们能够访问特定于容器的服务,如TimerService,安全上下文以及事务支持和监视等方面。无状态企业java bean也由应用程序服务器池化。

更新2:

@Tiny你的权利,但是如果AvayaDao不是EJB并且你的应用程序包含beans.xml文件,其中注册了拦截器或其他CDI特定的POJOS,则默认的bean-discovery-mode被“注释”并且注入将不起作用没有注释POJOS并且需要明确设置'all'值(http://www.adam-bien.com/roller/abien/entry/when_your_di_breaks_bean)。如果您明确知道您的应用程序仅部署在JAVA EE 7环境中,则另一个选择是不使用beans.xml。