Jakarta ee Can';bean对象中的t set字段

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

我需要创建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;
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;
......