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