Injection of NULL immediately after outjection
dkane Jul 5, 2007 7:30 AMHello
I have implemented a checkbox column for table multi-select, like in dvd store example.
When list is being updated (e.g.record is being removed), all checkboxes becomes unchecked with no depend on their previous state. I want checked positions to stay checked.
XHTML (action and checkbox are in bold):
<a:outputPanel id="cartPanel" rendered="#{cartList.rowCount>0}">
<div class="section">
<h:form id="createOrder">
<h1>Shopping cart</h1>
<h:dataTable value="#{cartList}" var="item">
<h:column>
<f:facet name="header">Quantity</f:facet>
<h:inputText value="#{item.quantity}" style="width: 30px;"/>
</h:column>
<h:column>
<f:facet name="header">Name</f:facet>
#{item.part.description}
</h:column>
<h:column>
<s:link id="cancel" value="Remove" action="#{cart.removeSelectedPosition}" reRender="cartPanel"/>
</h:column>
<h:column>
<h:selectBooleanCheckbox value="#{cartSelections[item]}"/>
</h:column>
</h:dataTable>
<h:commandButton id="createOrderBtn" value="Create order" action="#{createOrder.createOrder}"/>
Shopping cart code (I have added some debug code for injection-outjection) :
package com.avtohouse.ejb;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import javax.ejb.Remove;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.*;
import org.jboss.seam.ScopeType;
import java.io.Serializable;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.datamodel.DataModelSelection;
import org.jboss.seam.annotations.security.Restrict;
import javax.ejb.Stateful;
@Stateful
@Name("cart")
@Scope(ScopeType.SESSION)
@Restrict("#{identity.loggedIn}")
public class ShoppingCartBean implements ShoppingCart, Serializable
{
private List<OrderCMP> cartOrderList = new ArrayList<OrderCMP>();
@DataModelSelection
private OrderCMP selectedPosition;
@In
UserCMP user;
private Map<OrderCMP, Boolean> cartSelections;
public ShoppingCartBean()
{
cartSelections=new HashMap<OrderCMP, Boolean>();
}
@In(required=false)
public void setCartSelections(Map selection)
{
System.out.print("Injected selection = "+selection);
if (selection==null) return ;
cartSelections=selection ;
}
@Out(required=false)
public Map getCartSelections()
{
if (cartSelections==null) cartSelections=new HashMap<OrderCMP, boolean>();
System.out.print("Outjected selection = "+cartSelections);
return cartSelections;
}
public void addPart(PartCMP part, int quantity)
{
for (OrderCMP order: cartOrderList)
{
if (order.getPart().getPartId()==part.getPartId())
{
order.addQuantity(quantity);
return;
}
}
OrderCMP newOrder= new OrderCMP();
newOrder.setUserId(user.getUserId());
newOrder.setPart(part);
newOrder.setQuantity(quantity);
cartOrderList.add(newOrder);
}
public void addPart(PartCMP part)
{
this.addPart(part,1);
}
public void removeSelectedPosition()
{
if (selectedPosition!=null) removePart(selectedPosition);
}
public void removePart(OrderCMP order)
{
cartOrderList.remove(order);
}
@DataModel
public List<OrderCMP> getCartList()
{
return(cartOrderList);
}
............
After clicking "Remove" (removePart method is being called), position is properly removed but log says :
15:20:07,640 INFO [STDOUT] Injected selection = {}
15:20:07,640 INFO [STDOUT] Outjected selection = {}
15:20:07,640 INFO [STDOUT] Injected selection = null
So the problem is that cartSelections becomes null somehow.
Will appreciate any hints how to solve this .
Thanks !