Jakarta ee Can';bean对象中的t set字段
我需要创建bean对象并将它们保存在一个位置(列表)。对象应该为所有用户共享。但当我设置字段,然后调用该对象上的某个函数时,我得到了空指针Jakarta ee Can';bean对象中的t set字段,jakarta-ee,javabeans,Jakarta Ee,Javabeans,我需要创建bean对象并将它们保存在一个位置(列表)。对象应该为所有用户共享。但当我设置字段,然后调用该对象上的某个函数时,我得到了空指针 import java.util.ArrayList; import java.util.List; import javax.annotation.PostConstruct; import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; imp
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);
}
}
}
setPlace方法调用后的屏幕。置空
在执行PlaceWrapper对象方法期间,place对象为null
您将获得null,因为PlaceWrapper是无状态ejb的代理对象,所以它不能在方法调用之间保持状态。每个方法调用都针对PlaceWrapper的不同实例执行,因为在代理后面有一个ejb轮询
您可以更改范围do Session,它会工作,但它是错误的。我相信您在过度设计您的解决方案,根本不需要ejb。您只需删除@Stateless即可将PlaceWrapper变成CDI管理的bean。您注意到了吗,您正在查看的PlaceWrapper对象具有不同的ID。。。不考虑您的实际问题:在我看来,您完全混淆了应用程序中的不同层。另外,您不应该使用@Stateless会话bean来保存状态,这不是它们的目的。我看到ID是不同的,但这是我创建PlaceWrapper对象的唯一地方。我应该更改什么来正确创建PlaceWrapper bean?我将无状态更改为有状态。现在看起来不错。使用Stateful会有任何问题吗?
@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;
......