Stateful Session Bean을 사용하여 EJB 3.1을 프로그래밍하려고합니다. EJB가 무엇인지, 상태 저장, 상태 저장 및 싱글 톤의 차이점을 잘 이해해야합니다.EJB 3.1 Stateful Bean은 Singleton Bean처럼 동작합니다.
그러나 내 stateful bean에는 이상한 동작이 있습니다. 그것은 싱글 톤처럼 행동합니다! 내말은 여러 클라이언트/브라우저/머신에서 아래 서블릿 (ShoppingCartServlet)을 호출하면 같은 빈이 반환되고 매번 같은 값이 증가합니다. "count"값은 bean이 싱글 톤이기 때문에 클라이언트로부터 공유됩니다.
제발, 이해하겠습니다!
여기 코드입니다.
서블릿 코드
@WebServlet(name="ShoppingCartServlet", urlPatterns="/shoppingCart")
public class ShoppingCartServlet extends HttpServlet {
private static final long serialVersionUID = 2789580260930727133L;
@EJB
private ShoppingCart shoppingCart;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int count = shoppingCart.increaseCount();
HttpSession session = request.getSession();
session.setAttribute("count", count);
String nextJSP = "/shoppingCart.jsp";
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(nextJSP);
dispatcher.forward(request, response);
}
}
EJB 코드
@Stateful
@LocalBean
public class ShoppingCart {
private int count;
public int increaseCount() {
count++;
return count;
}
}
서블릿을 WAR 파일로 패키지 및 JAR 파일의 EJB. 둘 다 고유 한 EAR 파일에 배치됩니다.
편집 : 아래와 같이 내 서블릿 코드를 변경하려고했지만 모든 호출시에 새로운 Stateful Bean이 만들어졌습니다.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Context ctx = new InitialContext();
ShoppingCart shoppingCart = (ShoppingCart) ctx.lookup("java:global/jeeapp/jeeapp-business/ShoppingCart!org.madbit.jeeapp.shopping.ejb.ShoppingCart");
int count = shoppingCart.increaseCount();
HttpSession session = request.getSession();
session.setAttribute("count", count);
String nextJSP = "/shoppingCart.jsp";
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(nextJSP);
dispatcher.forward(request, response);
}
아마도 서블릿 대신 JAX-RS를 사용할 수 있습니까? –