Problems with picklist

UI Components for JSF
Post Reply
mgsoft
Posts: 24
Joined: 08 Jan 2011, 12:08

14 Feb 2011, 15:13

Hello,

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();
	}
Here the xhtml-fragment:

Code: Select all

<p:pickList id="listMaterials" value="#{editProjectDialog.materialsList}" converter="com.mydomain.appname.ui.converter.MaterialListDTOConverter" var="item" itemValue="#{item}" itemLabel="#{item.materialNumber}"/>
That's the controller:

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

mgsoft
Posts: 24
Joined: 08 Jan 2011, 12:08

01 Mar 2011, 10:54

Hi,

I found a solution by myself!

The problem was (is) a strange behaviour of Glassfish concerning persist,merge or attach operations on objects that references detached objects.
Definitly it isn't a problem or bug of Primefaces!

Post Reply

Return to “PrimeFaces”

  • Information
  • Who is online

    Users browsing this forum: No registered users and 18 guests