I have a strange problem when using the picklist component.
After a user logs in he opens a form that contains a picklist. After saving the form's content he might open the same form again. The picklist then contains some "empty" elements. Empty means that the display label contains no text as the element seems to refer to a model object that is null. See the converter:
Code: Select all
public Object getAsObject(FacesContext facesContext, UIComponent component, String submittedValue)
{
if(submittedValue.trim().isEmpty())
return null;
return new MaterialListDTO(Long.MIN_VALUE, submittedValue);
}
public String getAsString(FacesContext facesContext, UIComponent component, Object value)
{
if(value == null)
return null;
return ((MaterialListDTO) value).getMaterialNumber();
}
Code: Select all
<p:pickList id="listMaterials" value="#{editProjectDialog.materialsList}" converter="com.mydomain.appname.ui.converter.MaterialListDTOConverter" var="item" itemValue="#{item}" itemLabel="#{item.materialNumber}"/>
Code: Select all
@ManagedBean
@ViewScoped
public class EditProjectDialog
{
@Generated
private @EJB
ProjectBoundaryService boundaryService;
@Generated
private ProjectUpdateDTO modelObject;
@Generated
@EJB
private MaterialBoundaryService materialService;
@Generated
private DualListModel<MaterialListDTO> materialsList;
private ArrayList<MaterialListDTO> materialsSourceList;
/**
* @return the model object
*/
@Generated
public ProjectUpdateDTO getModelObject()
{
return modelObject;
}
/**
* @param modelObject
*/
@Generated
public void setModelObject(ProjectUpdateDTO modelObject)
{
this.modelObject = modelObject;
}
/**
* @return the item list
*/
@Generated
public DualListModel<MaterialListDTO> getMaterialsList()
{
return materialsList;
}
/**
* @param materialsList
*/
@Generated
public void setMaterialsList(DualListModel<MaterialListDTO> materialsList)
{
this.materialsList = materialsList;
}
/**
* @return the source item list
*/
@Generated
public ArrayList<MaterialListDTO> getMaterialsSourceList()
{
return materialsSourceList;
}
/**
* @return the navigation target
*/
@Generated
@PostConstruct
public String initView()
{
String selectedObjectId = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("selectedObjectId");
if(selectedObjectId == null || selectedObjectId.isEmpty())
{
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Could not initialize dialog!", null));
return "";
}
// Get data from server
try
{
modelObject = boundaryService.getProjectForUpdate(Long.parseLong(selectedObjectId));
// Get all available items for list!
materialsSourceList = new ArrayList<MaterialListDTO>(materialService.findMaterials("%"));
ArrayList<MaterialListDTO> materialsTargetList = new ArrayList<MaterialListDTO>(modelObject.getMaterials());
materialsList = new DualListModel<MaterialListDTO>(materialsSourceList, materialsTargetList);
}
catch (Exception e)
{
FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Could not initialize dialog!", e.getMessage());
FacesContext.getCurrentInstance().addMessage(null, msg);
}
return "";
}
/**
* Save model object
* @return the navigation target
*/
@Generated
public String save()
{
try
{
modelObject.getMaterials().clear();
for(MaterialListDTO item : materialsList.getTarget())
for(MaterialListDTO sourceItem : materialsSourceList)
{
if(sourceItem.getMaterialNumber().equals(item.getMaterialNumber()))
{
modelObject.getMaterials().add(sourceItem);
break;
}
}
boundaryService.updateProject(modelObject);
}
catch (Exception e)
{
FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Save operation failed!", e.getMessage());
FacesContext.getCurrentInstance().addMessage(null, msg);
}
return "";
}
}