无法在bean对象中设置字段

时间:2015-11-03 21:09:41

标签: java-ee javabeans

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

setPlace方法调用后的屏幕。地方仍然是空的 enter image description here

在执行PlaceWrapper对象方法期间,place对象为null enter image description here

1 个答案:

答案 0 :(得分:0)

因为PlaceWrapper是无状态ejb的代理对象,所以你得到null,所以它不能在方法调用之间保持状态。每个方法调用都是针对PlaceWrapper的不同实例执行的,因为代理后面有一个ejb民意调查。

你可以改变范围做会话,它会起作用,但这是错误的。我相信你已经过度设计了你的解决方案而且根本不需要ejb。您可以通过删除@Stateless来简单地将PlaceWrapper设置为CDI托管bean。