【问题标题】:Session bean returns the wrong value会话 bean 返回错误的值
【发布时间】:2015-07-27 13:01:38
【问题描述】:

我在 Wildfly 8 上运行的 Eclipse 项目中实现了以下 html 页面、servlet 类和 bean 类。

我遇到的问题是每次我用一些值调用 servlet 时,bean 类中的添加操作都会返回一个。我知道我没有做正确的微不足道的事情。我应该改变什么才能从添加操作中获得正确的值。

AddServlet.java

 import java.io.IOException;
 import java.io.PrintWriter;
 import javax.ejb.EJB;
 import javax.servlet.ServletException;
 import javax.servlet.annotation.WebServlet;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import ejb.AddEjb;

@WebServlet("/AddServlet")

public class AddServlet extends HttpServlet {
  private static final long serialVersionUID=1L;
  @EJB

AddEjb bean;
  public AddServlet() {
    super();
  }
  protected void doPost(HttpServletRequest request,
  HttpServletResponse response) throws ServletException,
  IOException {
    PrintWriter out=response.getWriter();
    int i=Integer.parseInt(request.getParameter("t1"));
    int j=Integer.parseInt(request.getParameter("t2"));
    bean.setI(i);
    bean.setJ(j);
    bean.add();
    out.print("Addition using bean is test EJB : " + bean.getK());
  }
}

AddEjb.java

package ejb;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;


@Stateless
@LocalBean
public class AddEjb
{
    private int i,j,k;

    public AddEjb() {

    }

    public int getI() {
        return i;
    }

    public void setI(int i) {
        this.i = i;
        System.out.println("i set" + this.i);
    }

    public int getJ() {
        return j;
    }

    public void setJ(int j) {
        this.j = j;
        System.out.println("j set" + this.j);
    }


    public int getK() {
        System.out.println("K returned" + this.k);
        System.out.println("K returned" + k);
        return this.k;
    }


    public void setK(int k) {
        this.k = k;
        System.out.println("k set" + this.k);
    }

    public void add()
    {
        this.k = this.i + this.j;
        System.out.println("k set" + this.k);
    }


}

index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>First EJB</title>
</head>
<body>
    <form action="AddServlet" method="post">
        Enter 1st Number : <input type="text" name="t1"><br>
        Enter 2nd Number : <input type="text" name="t2"><br>

        <input type=submit>
    </form>
</body>
</html>

以下是系统输出日志

18:14:20,601 INFO  [org.jboss.as] (Controller Boot Thread) JBAS015874: WildFly 8.2.0.Final "Tweek" started in 9104ms - Started 296 of 349 services (92 services are lazy, passive or on-demand)
18:14:46,936 INFO  [stdout] (default task-2) i set78
18:14:46,942 INFO  [stdout] (default task-2) j set22
18:14:46,945 INFO  [stdout] (default task-2) k set0
18:14:46,949 INFO  [stdout] (default task-2) K returned0
18:14:46,950 INFO  [stdout] (default task-2) K returned0

【问题讨论】:

  • 您的 EJB 是 @Stateless。它不会记住任何事情......
  • @SteveC 甚至在 OP 的代码中也很重要
  • @Synex 你也可以添加你看到的sysout日志
  • @6ton - 它是无状态的这一事实非常重要。对 EJB 的每一次调用都可能针对不同的(可能是新的)实例。
  • “我遇到的问题是,每次我用一些值调用 servlet 时,bean 类中的添加操作都会返回零。” - OP 的问题是在对 servlet 的单独调用还是在同一个调用中没有获取值,从描述中不清楚。同样从代码看来,在同一个调用中应该有输出

标签: java jakarta-ee servlets ejb session-bean


【解决方案1】:

@Stateless 注释用于告诉容器此 bean 的实例可以互换使用。当您向无状态 bean 发送请求时,容器会从 bean 池中选择一个 bean 实例,并不能保证任何两个请求都由同一个实例提供服务。

您在这里看到的行为是,当您发送“set”请求时,它们每个都由某些 bean 实例提供服务,然后当您调用“get”方法时,它们将由完全不同的实例提供服务。您获得的具体实例取决于容器,并且未在 EJB 规范中定义。

如@Ayhan 所说,如果您想保持通话之间的对话状态,您应该使用@Stateful 会话bean。如果您需要在客户端之间共享此状态,您可能需要一个 @Singleton bean。

【讨论】:

    【解决方案2】:

    您的 ejb 无状态。 更改 ejb 有状态

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-13
      • 2011-08-14
      • 2016-09-23
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多