在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
答案 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。