Не может сохраняться в сессионном компоненте с состоянием - PullRequest
1 голос
/ 05 мая 2019

Я делаю корзину для покупок, используя подход с использованием сессионных компонентов Java EE Application.Я планирую, что после того, как пользователь нажмет кнопку «Оформить заказ», заказ будет добавлен в базу данных.Однако заказ не обновляется в базе данных.

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 in War

@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";
    }
}

*********************** ОБНОВЛЕНИЕ **********************

Я только что сделал тест.Список корзин в ShoppingCartFacade.java пуст.

1 Ответ

0 голосов
/ 09 мая 2019

Вам необходимо знать об управлении жизненным циклом различных используемых вами компонентов.

@Stateful bean-компоненты неявно связаны с сеансом сервлета / JSF.

Новый экземпляр ShoppingCartManagedBean будет создаваться для каждого входящего запроса, так как он @RequestScoped. Этот экземпляр автоматически получит ссылку на новый экземпляр ShoppingCartManagement, который, в свою очередь, получит ссылку на новый экземпляр ShoppingCartFacade.

Вам нужно либо:

  1. Измените ShoppingCartManagedBean на @SessionScoped или

  2. Создайте @SessionScoped фасад, который делегирует ссылку ShoppingCartManagement и вставьте ее вместо EJB.

Любой из этих методов будет связывать ваш сессионный компонент с состоянием с сеансом сервлета / JSF.

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