无法在有状态会话Bean中保留

时间:2019-05-05 08:51:45

标签: java java-ee netbeans ejb stateful

我正在使用Java EE应用程序的有状态会话bean方法来制作购物车。我的计划是在用户单击“结帐”按钮后,订单将被添加到数据库中。但是,订单不会在数据库中更新。

Structure

ShoppingCartFacade.java

@Stateful
public class ShoppingCartFacade implements ShoppingCartFacadeLocal {

    @PersistenceContext(unitName = "DProject-ejbPU", type = PersistenceContextType.EXTENDED)
    private EntityManager em;

    private void create(Tickettable tickettable) {
        em.persist(tickettable);
    }

    private ArrayList<Tickettable> ticketCart;

    @PostConstruct
    private void initializeBean(){
        ticketCart = new ArrayList<>();
    }

    @Override
    public boolean add(Tickettable tickettable) {
        boolean result = false;

        //Set the correct user and showtime table
        tickettable.setUserid(this.getUsertableFrom(tickettable.getUserid().getUserid()));
        tickettable.setShowtimeid(this.getShowtimetableFrom(tickettable.getShowtimeid().getShowtimeid()));

        try {
            //Already have ticket for this showtime
            for (Tickettable ticket : ticketCart) {
                if (ticket.getShowtimeid().getShowtimeid().equals(tickettable.getShowtimeid().getShowtimeid())) {
                    ticket.setQuantity(ticket.getQuantity() + tickettable.getQuantity());
                    result = true;
                }
            }
            //New ticket
            if (!result) {
                ticketCart.add(tickettable);
                result = true;
            }
        } catch (Exception ex) {
        }
        return result;
    }

    @Override
    public ArrayList<Tickettable> getCart() {
        return ticketCart;
    }

    @Override
    public boolean checkOut() {
        try {
            for (Tickettable ticket : ticketCart) {
                create(ticket);
            }
            ticketCart.clear();
            return true;
        } catch (Exception e) {
        }
        return false;
    }

    private Usertable getUsertableFrom(String userId) {
        Usertable u = em.getReference(Usertable.class, userId);
        return u;
    }

    private Showtimetable getShowtimetableFrom(String showtimeId) {
        Showtimetable s = em.getReference(Showtimetable.class, showtimeId);
        return s;
    }

    @Remove
    public void remove() {
        ticketCart = null;
    }
}

ShoppingCartManagement.java

@Stateful
public class ShoppingCartManagement implements ShoppingCartManagementRemote {
    @EJB
    private ShoppingCartFacadeLocal shoppingCartFacade;

    @Override
    @PermitAll
    public boolean add(TicketDTO ticketDTO) {
       if (ticketDTO == null) {
            // just in case
            return false;
        }

        // convert to entity
        Tickettable ticket = Utility.ticketDTO2Entity(ticketDTO);
        // add one
        return shoppingCartFacade.add(ticket);
    }

    @Override
    @PermitAll
    public ArrayList<TicketDTO> getCart() {
        try {
            ArrayList<Tickettable> alst = shoppingCartFacade.getCart();

            if (alst.isEmpty()) {
                //not found
                return null;
            } else {
                ArrayList<TicketDTO> alsDTO = new ArrayList<>(alst.size());
                for (Tickettable stt : alst) {
                    TicketDTO stDTO = Utility.ticketEntity2DTO(stt);
                    alsDTO.add(stDTO);
                }
                return alsDTO;
            }
        } catch (NullPointerException e) {
            throw e;
        }
    }

    @Override
    @PermitAll
    public boolean checkOut() {
        return shoppingCartFacade.checkOut();
    }
}

战争中的ShoppingCartManagedBean.java

@Named(value = "shoppingCartManagedBean")
@RequestScoped
public class ShoppingCartManagedBean implements Serializable{

 .....

    @EJB
    private ShoppingCartManagementRemote shoppingCartManagement;

    public String addTicket(){

        this.quantity += 1;

        UserDTO u = new UserDTO(userId,"","","","","");
        ShowtimeDTO s = new ShowtimeDTO(showtimeId,"","","","","");

        TicketDTO t = new TicketDTO("111111",u,s,Integer.toString(this.quantity));
        //carts = shoppingCartManagement.getCart();
        boolean result =  shoppingCartManagement.add(t);
        if(result){
            return "success";
        }
        return "failure";
    }

    public String checkout(){
        /*return shoppingCartManagement.checkOut();*/

        boolean result = shoppingCartManagement.checkOut(); 
        if(result) return "success";
        return "failure";
    }
}

************************更新******************** < / p>

我刚刚进行了测试。 ShoppingCartFacade.java 中的cartList为空。

1 个答案:

答案 0 :(得分:0)

您需要了解所使用的各种bean的生命周期管理。

@Stateful bean没有与servlet / JSF会话隐式关联。

将为每个传入的请求创建一个ShoppingCartManagedBean的新实例,因为它是@RequestScoped。此实例将自动获得对ShoppingCartManagement的新实例的引用,而该引用又将得到对ShoppingCartFacade的新实例的引用。

您需要:

  1. ShoppingCartManagedBean更改为@SessionScoped,或

  2. 创建一个@SessionScoped门面,该门面委托给ShoppingCartManagement参考,并将其插入EJB。

这两种方法均会将您的有状态会话bean与servlet / JSF会话相关联。