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



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

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

但我不明白如何在JavaEE项目中做到这一点。我发现:

@注入私人阿瓦亚道阿瓦亚道;

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

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

但无济于事。这是我的刀:

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

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

更新1:

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

更新2:

@Tiny您的权利,但如果AvayaDao不是EJB,并且您的应用程序包含beans.xml文件,其中注册了拦截器或其他CDI特定的POJOS,则默认的bean发现模式为"annotated",并且注入将不适用于未注释的POJO,并且需要显式设置"all"值(http://www.adam-bien.com/roller/abien/entry/when_your_di_breaks_bean)。如果您明确知道您的应用程序仅部署在JAVAEE7环境中,那么另一种选择是不使用beans.xml。

最新更新