我需要创建bean对象并将它们保存在一个地方(List)。应为所有用户共享对象。但是当我设置字段然后在该对象上调用某个函数时,我得到了空指针。
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import com.skoczo.db.dao.PlaceDao;
import com.skoczo.db.entity.Place;
import com.skoczo.util.PlaceWrapper;
@Singleton
@Named
public class PlaceManager {
private List<PlaceWrapper> places;
@Inject
private PlaceDao placeDao;
public List<PlaceWrapper> getPlaces() throws NamingException
{
if(places == null) {
initialize();
}
return places;
}
@PostConstruct
private void initialize() throws NamingException {
places = new ArrayList<PlaceWrapper>();
for(Place p : placeDao.findAll()) {
PlaceWrapper pw = (PlaceWrapper) InitialContext.doLookup("java:module/PlaceWrapper");
pw.setPlace(p); <-- ####### problematic place ########
places.add(pw);
}
}
}
我将Place对象设置在我的包装器中,但是当我在PlaceWrapper对象上调用某个函数时,Place为null。
放置课程:
@Stateless(name="PlaceWrapper")
public class PlaceWrapper implements Serializable{
private static final long serialVersionUID = 932851913058781818L;
@Inject
private AudioManagerData audioManagerData;
@Inject
private PlaceDao placeDao;
public void setPlace(Place p) {
this.p = p;
}
public void setVolume(int vol) throws IOException {
audioManagerData.setVol(getPlace().getSoundCard(), vol);
setVol(vol);
}
public int getVolume() throws Exception {
if (getVol() == -1) {
setVol(audioManagerData.getVol(getPlace().getSoundCard()));
}
return getVol();
}
private int vol = -1;
private Station station;
private String song;
private Place p;
......
答案 0 :(得分:0)
因为PlaceWrapper是无状态ejb的代理对象,所以你得到null,所以它不能在方法调用之间保持状态。每个方法调用都是针对PlaceWrapper的不同实例执行的,因为代理后面有一个ejb民意调查。
你可以改变范围做会话,它会起作用,但这是错误的。我相信你已经过度设计了你的解决方案而且根本不需要ejb。您可以通过删除@Stateless来简单地将PlaceWrapper设置为CDI托管bean。