Корзина пуста

- Я разрабатываю приложение электронной коммерции Java EE с использованием WildFly 9.0 PostGresql, JSF, управляемых компонентов, компонентов управления данными и т. д. на IntelliJ. - пользователь может щелкнуть категорию, и продукты, относящиеся к этой категории, отобразятся в сетке PrimeFaces. - Выбранный продукт и его количество можно добавить в список в ShoppingCartBean.java (CopyOnWriteArrayList cartItemList;) - Вышеприведенный экземпляр компонента вводится (с использованием @EJB) в CartFacade.java, который вводится в управляемый компонент. - Ошибок не зафиксировано, система не вылетает, развертывается идеально, добавляет выбранный товар в корзинуItemList. - При вызове ViewCart.xhtml список массивов сбрасывается до пустого. Я пытаюсь решить эту проблему в течение трех дней. Пожалуйста, может кто-нибудь помочь. Спасибо

Вот код. Первый: ShoppingCartBean.Java (импорт удален для краткости). Это реализует удаленный интерфейс и локальный интерфейс.

@Stateful(name="ShoppingCart")
public class ShoppingCartBean implements ShoppingCart, ShoppingCartLocal {

@PersistenceContext(unitName ="Shop", type=PersistenceContextType.EXTENDED)


   private EntityManager cartEntityManager;
    private CustomerManager customerManagerBean;
    private CopyOnWriteArrayList<Orderitem> cartItems = new CopyOnWriteArrayList<>();
    private  CustomerEntity customer=null;


    public ShoppingCartBean(){}


    @PostConstruct
    private void initialize(){

    }


    @Override
    public boolean addCartItem(ProductEntity product, int quantityPurchased){
        com.shop.entity.Orderitem basketItem=new Orderitem();
        Locale currentLocale = new Locale("en", "GB");
        double subTotal;
        Boolean returnVal=false;

        if(cartItems.size()!=0) {
            // check for duplicate entry.
            for (Orderitem itemsIntheCart : cartItems) {
                if (itemsIntheCart.getItemcode().equals(product.getItemcode())) {
                    returnVal = false;
                }
            }
        }
        // now that we're sure that the item doesn't already exist in the basket
        // lets add the Orderitem to the cart
        basketItem.setItemcode(product.getItemcode());
        basketItem.setItemdescription(product.getItemdescription());
        basketItem.setUnitprice(product.getUnitprice());
        basketItem.setQuantitypurchased(quantityPurchased);
        subTotal=quantityPurchased*basketItem.getUnitprice();
        Double currencyAmount = new Double(subTotal);
        NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance(currentLocale);
        currencyFormatter.format(currencyAmount);
        basketItem.setSubtotal(currencyAmount);

        synchronized (cartItems) {
            cartItems.add(basketItem);
        }
        //syncCart =  java.util.Collections.synchronizedList(cart);
        System.out.println("just added an item to cartitemslIst " + cartItems.size());


        if(cartItems!=null){
            returnVal= true;
        }

        return returnVal;
    }


@Override
    public List<Orderitem> viewCartItems(){
        return getCartItems();
    }
/***********This method is accessed by the CartFacade.java See below*****/
    @Override
    public List<Orderitem> getCartItems(){
        CopyOnWriteArrayList<Orderitem> cartItemList;// = new CopyOnWriteArrayList<Orderitem>();
        cartItemList= this.cartItems;
        System.out.println("inside get cart items " + this.cartItems.size()); // this returns zero!!!!
        return cartItemList;
    }
/***********************end of offending method**********************/
}

затем телега Фасад

Stateful(name="ShoppingCartLocal")
@SessionScoped
public class CartFacade {
    private CopyOnWriteArrayList<Orderitem>myCartList ;
    @PersistenceContext(unitName ="Shop")
    EntityManager cartEntityManager;

    @EJB
    ShoppingCart cartBean;//= new ShoppingCartBean();

    public CartFacade(){}

    //public void assignCustomerToCart(CustomerEntity customer){
        //cartBean.setCustomer(customer);
    //}

    public boolean addItemToCart(ProductEntity product, int quantityPurchased){
        boolean result = false;
        result=cartBean.addCartItem(product, quantityPurchased);
        System.out.println("Result from cart facade " + result);
        return result;
    }
    public List<Orderitem> viewItemsIntheCart(){
        CopyOnWriteArrayList<Orderitem> myCartList;
        //this stops the inner cart from getting returned to the front
        myCartList= (CopyOnWriteArrayList<Orderitem>) cartBean.getCartItems();
        return myCartList;
    }

затем внутри управляемого компонента

@ManagedBean(name="ViewCartManagedBean")
@SessionScoped
public class ViewCartManagedBean {
    CopyOnWriteArrayList<Orderitem> cartItemsList = new CopyOnWriteArrayList<Orderitem>();
    @EJB
    com.shop.cart.CartFacade cartFacade;
    private double cartTotal;
    public double getCartTotal() {
        return cartTotal;
    }


    public ViewCartManagedBean(){}

    @PostConstruct
    public void initialize(){
        setCartItemsList();
    }
    public List<Orderitem> getCartItemsList() {
        //setCartItemsList();
        return cartItemsList;
    }

    public void setCartItemsList() {
        cartItemsList=null;
        cartItemsList = (CopyOnWriteArrayList<Orderitem>) cartFacade.viewItemsIntheCart();
    }

Наконец, страница xhtml (ViewCart.xhtml)

    <body>
<h:outputText value="Cart List"
              style="font-family: Verdana, Helvetica, sans-serif;font-size: 18px;  font-weight: 900;" />
<h:form name="ViewCartManagedBean">

    <h:dataTable var="cartList"
                 value="#{ViewCartManagedBean.cartItemsList}" styleClass="order-table"
                 headerClass="order-table-header"
                 rowClasses="order-table-odd-row,order-table-even-row">
        <h:column>
            <f:facet name="header">
                <h:outputText value="Item Code"
                              style="font-family: Verdana, Helvetica, sans-serif;font-size: 16px;" />
            </f:facet>
            <h:outputText value="#{cartList.itemcode}"
                          style="font-family: Verdana, Helvetica, sans-serif;font-size: 14px;" />
        </h:column>
        <h:column>
            <f:facet name="header">
                <h:outputText value="Description"
                              style="font-family: Verdana, Helvetica, sans-serif;font-size: 16px;" />
            </f:facet>
            <h:outputText value="#{cartList.itemdescription}"
                          style="font-family: Verdana, Helvetica, sans-serif;font-size: 14px;" />
        </h:column>
        <h:column>
            <f:facet name="header">
                <h:outputText value="Quanitity"
                              style="font-family: Verdana, Helvetica, sans-serif;font-size: 16px;" />
            </f:facet>
            <h:outputText value="#{cartList.quantitypurchased}"
                          style="font-family: Verdana, Helvetica, sans-serif;font-size: 14px;" />
        </h:column>
        <h:column>
            <f:facet name="header">
                <h:outputText value="Unit Price"
                              style="font-family: Verdana, Helvetica, sans-serif;font-size: 16px;" />
            </f:facet>
            <h:outputText value="#{cartList.unitprice}"
                          style="font-family: Verdana, Helvetica, sans-serif;font-size: 14px;">
                <f:convertNumber currencySymbol="£" groupingUsed="true"
                                 maxFractionDigits="2" type="currency" />
            </h:outputText>
        </h:column>
        <h:column>
            <f:facet name="header">
                <h:outputText value="Sub Total"
                              style="font-family: Verdana, Helvetica, sans-serif;font-size: 16px;" />
            </f:facet>
            <h:outputText value="#{cartList.subtotal}"
                          style="font-family: Verdana, Helvetica, sans-serif;font-size: 14px;"
                          converter="javax.faces.BigDecimal">
                <f:convertNumber currencySymbol="£" groupingUsed="true"
                                 maxFractionDigits="2" type="currency" />
            </h:outputText>
        </h:column>
    </h:dataTable>
    <f:facet name="header">
        <h:outputText value="Grand Total"
                      style="font-family: Verdana, Helvetica, sans-serif;font-size: 16px;" />
    </f:facet>
    <h:outputText value="#{ViewCartManagedBean.cartTotal}"
                  style="font-family: Verdana, Helvetica, sans-serif;font-size: 14px;"
                  converter="javax.faces.BigDecimal">
        <f:convertNumber currencySymbol="£" groupingUsed="true"
                         maxFractionDigits="2" type="currency" />
    </h:outputText>
</h:form>
<h:link value="Continue Shopping" outcome="Products" />
</body>

person Lalin Pethiyagoda    schedule 02.08.2015    source источник
comment
Привет BalusC. Спасибо, это import javax.faces.bean.SessionScoped;   -  person Lalin Pethiyagoda    schedule 03.08.2015


Ответы (1)


Используете ли вы удаленные компоненты? Если нет, я бы избавился от ваших аннотаций Stateful и просто использовал javax.enterprise.context.SessionScoped как для компонента, так и для фасада.

person teacurran    schedule 03.08.2015
comment
Привет Терренс, спасибо за ваш ответ. Импорт не определяется в IntelliJ 14 Ultimate, хотя библиотека Java EE 6 находится в папке библиотек. Любые другие идеи, пожалуйста.. - person Lalin Pethiyagoda; 04.08.2015
comment
Хм. Я не знаю, почему импорт не работает. У меня есть проект, использующий @SessionScoped, который, как я знаю, работает в IntelliJ. Возможно, взгляните на мой файл pom.xml и посмотрите, чем он отличается от вашего? github.com/teacurran/java-experiments/tree/master/ - person teacurran; 05.08.2015