【问题标题】:Stateless EJB method return null in servlets无状态 EJB 方法在 servlet 中返回 null
【发布时间】:2026-01-10 05:15:01
【问题描述】:

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

Java:

@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。这发生在一个请求中。为什么会这样?

【问题讨论】:

  • 两个进程是否在同一个JVM中运行?
  • 这不是你的问题的原因,但仅供参考,在这种情况下你可能应该使用有状态的 bean,而不是无状态的
  • @etherous 有状态 bean 工作正常。我的问题是为什么会发生这种情况?
  • “无状态”中不清楚的地方。 “无状态”的意思是“不保持会话状态”。显然,您不应该将状态存储在无状态服务中。
  • 每次调用无状态 bean 的方法时,都可能使用不同的 bean 实例。无状态 bean 没有 HTTP 请求范围。他们甚至不知道 HTTP 请求。他们不能保持会话状态。有状态的 bean 是可以做到这一点的 EJB。

标签: java servlets ejb


【解决方案1】:

我认为您需要了解一些关于无状态 EJB 工作原理的关键概念。

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

@EJB
PersonBean person;

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

没有人,实际上person是一个位于EJB Container中的对象的代理, 它充当您的代码和 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)由不同的对象解析。

【讨论】: