无状态EJB方法在servlet中返回null

时间:2014-05-31 17:11:51

标签: java servlets ejb

我一直在测试我的无状态ejb:

爪哇:

@Stateless
@Remote
public class PersonBean {
private String name;
private int reputation;

public String getName(){
    return name;
}

public void setName(String name){
    this.name=name;
}

public int getReputation(){
    return reputation;
}

public void addReputation(){
    reputation++;
}


/**
 * Default constructor. 
 */
public PersonBean() {
    // TODO Auto-generated constructor stub
    reputation=1;
}

}

和servlet:

    @EJB
PersonBean person;


    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException {
    // TODO Auto-generated method stub
    person.setName("Mahdi");
    String str=person.getName();
    person.addReputation();
    response.getWriter().write(person.getName()+"  
            with"+person.getReputation());

}

但是当我调用servlet时它返回:null with 1。它应该返回Mahdi with 1。这发生在一个请求中。为什么会这样?

1 个答案:

答案 0 :(得分:0)

我认为您需要了解有关无状态EJB如何工作的一些关键概念。

在某些时候,可以存在位于EJBContainer的PersonBean个对象的多个实例。 这个实例集合由EJBContainer管理, 这意味着它可以添加/删除并选择哪一个将完成工作。

@EJB
PersonBean person;

如果有多个实例,前一个代码注入了哪一个?

没有人,实际上person是位于EJB容器中的对象的代理, 充当代码和ejb实例之间的中介。

每次使用此代理调用业务方法时, 它向EJBContainer组件发送消息,除其他外, 从列表中选择将处理请求的实例。

假设有三个ejb实例:

//the first one process this request
person.setName("Mahdi");
//a second instance processes this other request, thus, null is returned.
String str=person.getName();
//and a third one could process this; thus his reputation attribute will be 2
person.addReputation(); 

如您所见,三个操作(set,get和addReputation)由不同的对象解决。