Java 会话bean返回错误的值

Java 会话bean返回错误的值,java,jakarta-ee,servlets,ejb,session-bean,Java,Jakarta Ee,Servlets,Ejb,Session Bean,我在运行于wildfly 8的eclipse项目中实现了以下html页面、servlet类和bean类 我遇到的问题是,每次我用一些值调用servlet时,bean类中的add操作都会返回一个零。我知道我没有做一件小事。我应该更改什么以从“添加”操作中获得正确的值 AddServlet.java import java.io.IOException; import java.io.PrintWriter; import javax.ejb.EJB; import javax.servle

我在运行于wildfly 8的eclipse项目中实现了以下html页面、servlet类和bean类


我遇到的问题是,每次我用一些值调用servlet时,bean类中的add操作都会返回一个零。我知道我没有做一件小事。我应该更改什么以从“添加”操作中获得正确的值

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());
  }
}
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);
    }


}
AddEjb.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());
  }
}
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


第一个EJB
输入第一个号码:
输入第二个号码:
以下是sysout日志

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是无状态的。
changejbstateful

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

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


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

您的EJB是@Stateless。它什么也记不起来了…@SteveC会无状态的,甚至在OP中也很重要code@Synex您还可以添加您需要的sysout日志吗see@6ton-事实上,它是无国籍的,这一点非常重要。对EJB的每次调用都可能是对不同(可能是新的)实例的调用。“我遇到的问题是,每次我用一些值调用servlet时,bean类中的add操作都会返回一个零。”-OP的问题是在对servlet的单独调用或同一调用中没有获取值,从描述中不清楚。同样,从代码来看,似乎在同一个调用中需要输出