Stateful EJB не сохраняет информацию - PullRequest
0 голосов
/ 28 апреля 2010

Я создал простую корзину. Он хорошо хранит элемент, и я могу вернуть страницу, и элемент остается там, но как только я добавляю другой элемент в корзину, он сбрасывает и просто сохраняет этот элемент. Есть идеи?

Спасибо

@Stateful(name="CartSessionBean")
@Remote(CartSession.class)
public class CartSessionBean implements CartSession, java.io.Serializable {

    private Cart items;

    @Init
    public void create() {
        items = new Cart();
    }

    public void add(Book item, int qty) {

        items.addItem(item, qty);

    }

Cart.java

@Entity

@ Table (name = "Корзина") Открытый класс Cart реализует java.io.Serializable {

@Id @GeneratedValue
@Column(name="id")
private int id;

@Column(name = "total")
private Double total;

@OneToMany(mappedBy="cart")
private Set<Item> items;

public Cart(){
    // not valid?

}

//setters and getters

public int getOrder(){
    return id;
}

public void setOrder(int order){
    this.id = order;
}

public Double getTotal(){
    return total;
}

public void setTotal(Double q){
    this.total = q;
}

public Set<Item> getItems(){
    return this.items;
}

public void setItems(Set<Item> i){
    this.items = i;
}

public void addItem(Book b, int qty) {

    if(items == null) {
        items = new HashSet();
    }

    Item i = new Item();
    i.setBook(b);
    i.setQty(qty);

    this.items.add(i);
}

public void removeItem(Item id) {
    this.items.remove(id);
}

public void emptyCart() {
    this.items.clear();
}

}

Servlet

public class ServletCart extends HttpServlet {

    private Set<Item> items;

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {

        // NO need.

        // DO WE HAVE A REMOVE REQUEST??

        if (items == null) {

            try {
                InitialContext context = new InitialContext();
                CartSession cartitems = (CartSession) context.lookup("CartSessionBean/remote");
                items = cartitems.getItems();
            } catch (NamingException e) {
                throw new ServletException("JNDI problem", e);
            }

        }

        RequestDispatcher view = request.getRequestDispatcher("cart.jsp");
        request.setAttribute("items", items);
        request.setAttribute("size", items.size());
        view.forward(request, response);
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {

        // Add a book :s/

        String isbn = request.getParameter("isbn"); // Does this ISBN exsit?
        int quantity = Integer.parseInt(request.getParameter("qty")); // Is this a number ?

        Book bk;

        try {
            InitialContext context = new InitialContext();
            BookSession guestbookSession = (BookSession) context.lookup("BookSessionBean/remote");
            bk = guestbookSession.getBook(isbn);

            CartSession cartitems = (CartSession) context.lookup("CartSessionBean/remote");
            cartitems.add(bk, quantity);

            this.items = cartitems.getItems();

        } catch (NamingException e) {
            throw new ServletException("JNDI problem", e);
        }

        request.setAttribute("response", bk.getBookTitle() + " Added.");

        doGet(request, response);

    }
}

1 Ответ

0 голосов
/ 29 апреля 2010

Существует несколько проблем с кодом, представленным ниже:

  1. Нельзя хранить переменные экземпляра в сервлете без синхронизации. Все запросы к сервлету совместно используют один и тот же экземпляр, поэтому переменные экземпляра будут общими.
  2. CartSession.getItems - это вызов удаленного метода, поэтому список возвращаемых элементов копируется и передается по значению. Похоже, вы пытались обойти это?
  3. Каждый вызов context.lookup («CartSessionBean / remote») создает новый экземпляр сессионного компонента с состоянием.

Вам нужно сделать что-то вроде: найти или создать HttpSession из вашего HttpServletRequest, найти или создать экземпляр cart в сеансе, а затем работать с компонентом сеанса cart.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...