You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@myfaces.apache.org by MPF <ma...@procon.co.at> on 2008/03/03 16:36:48 UTC

myFaces 1.2 - Converter Problem

Hi!
I use 
Tomcat 6
myFaces 1.2.2
tomahawk 1.1.6

I tried do create a Converter for following model:


public class PlanningPoint {
	private String country;
	private String location;
	private String street;
	private String postCode;
	private String houseNumber;
	private String identifier;

	public PlanningPoint(final String country, final String location, final
String street,
			final String postCode, final String houseNumber) {
		super();
		this.country = country;
		this.location = location;
		this.street = street;
		this.postCode = postCode;
		this.houseNumber = houseNumber;
	}

	public PlanningPoint() {
	}

	public String toString() {
		return this.country + ";" + this.location + ";" + this.street + ";" +
this.postCode + ";"
			+ this.houseNumber + ";" + this.identifier;
	}

	public String getCountry() {
		return this.country;
	}

	public void setCountry(final String country) {
		this.country = country;
	}

	public String getLocation() {
		return this.location;
	}

	public void setLocation(final String location) {
		this.location = location;
	}

	public String getStreet() {
		return this.street;
	}

	public void setStreet(final String street) {
		this.street = street;
	}

	public String getPostCode() {
		return this.postCode;
	}

	public void setPostCode(final String postCode) {
		this.postCode = postCode;
	}

	public String getHouseNumber() {
		return this.houseNumber;
	}

	public void setHouseNumber(final String houseNumber) {
		this.houseNumber = houseNumber;
	}

	public String getIdentifier() {
		return this.identifier;
	}

	public void setIdentifier(final String identifier) {
		this.identifier = identifier;
	}
}


Thats the converter:

public class PlanningPointConverter implements Converter {

	public Object getAsObject(final FacesContext context, final  UIComponent
component, final String value) {
		if (value == null) {
			return new PlanningPoint();
		} else if (value.isEmpty()) {
			return new PlanningPoint();
		}
		PlanningPoint p = new PlanningPoint();
		try {
		    String [] pComps = StringUtility.split(value, ";");
		    p.setCountry(pComps[0]);
		    p.setLocation(pComps[1]);
		    p.setStreet(pComps[2]);
		    p.setPostCode(pComps[3]);
		    p.setHouseNumber(pComps[4]);
		    p.setIdentifier(pComps[5]);
		} catch (ConverterException e) {
			e.printStackTrace();
		}
	    return p;
	}	

	public String getAsString(final FacesContext context, final  UIComponent
component, final Object value) {
		if (value.equals("") || value == null) {
			return "";
		} else {
			
		}
		PlanningPoint p = (PlanningPoint) value;
		String s = "";
		try {
			s = ((PlanningPoint) value).toString();		
		} catch (ConverterException e) {
			e.printStackTrace();
		}
		return s;
	}	
}


jsp snippet:

<h:panelGrid id="planningPG5" columns="2" border="1">
			<h:outputText value="#{labels.planStartDropdown}"
				styleClass="outputText"
				rendered="#{planningContrl.renderGeoDropDownStart}" />
			<h:selectOneMenu id="planGeoDropdown1"
				value="#{planningContrl.geoStartDropDownSelected}"
				rendered="#{planningContrl.renderGeoDropDownStart}">
				<f:converter converterId="planningPointConverter" />
				<f:selectItems value="#{planningContrl.geoStartDropDownList}" />
			</h:selectOneMenu>
			<h:outputText value="#{labels.planEndDropdown}"
				styleClass="outputText"
				rendered="#{planningContrl.renderGeoDropDownEnd}" />
			<h:selectOneMenu id="planGeoDropdown2"
				value="#{planningContrl.geoEndtDropDownSelected}"
				rendered="#{planningContrl.renderGeoDropDownEnd}">
				<f:converter converterId="planningPointConverter" />
				<f:selectItems value="#{planningContrl.geoEndDropDownList}" />
			</h:selectOneMenu>
		</h:panelGrid>


controller snippet:

public class PlanningController {
	private boolean renderGeoDropDownStart;
	private boolean renderGeoDropDownEnd;
	private List<SelectItem> geoEndDropDownList;
	private PlanningPoint geoEndtDropDownSelected;
	private List<SelectItem> geoStartDropDownList;
	private PlanningPoint geoStartDropDownSelected;

public void geocodeStart(final ActionEvent event) {
		try {
			this.setDropDownGeo(this.model.geocode(this.startPoint),
PlanningController.DropDown.GEO_START);
			this.startPoint = new PlanningPoint();
			this.renderGeoDropDownStart = true;
		} catch (WebserviceException e) {
			UIComponent component =
ComponentSupport.getComponentById("subViewPlanning:fPlanning");
			ComponentSupport.showMessageFromBundle(component, "errorMsgWebservice");
		}
	}

	public void geocodeEnd(final ActionEvent event) {
		try {
			this.setDropDownGeo(this.model.geocode(this.endPoint),
PlanningController.DropDown.GEO_END);
			this.endPoint = new PlanningPoint();
			this.renderGeoDropDownEnd = true;
		} catch (WebserviceException e) {
			UIComponent component =
ComponentSupport.getComponentById("subViewPlanning:fPlanning");
			ComponentSupport.showMessageFromBundle(component, "errorMsgWebservice");
		}
	}

	private void setDropDownGeo(final List<PlanningPoint> l, final DropDown d)
{
		List<SelectItem> tmpList = new LinkedList<SelectItem>();
		tmpList.add(new SelectItem(""));
		for (PlanningPoint p : l) {
			this.geoStartDropDownSelected = p;
			tmpList.add(new SelectItem(p, p.getIdentifier()));
		}		
		switch (d) {
		case GEO_START:
			this.geoStartDropDownList.addAll(tmpList);						
			break;
		case GEO_END:
			this.geoEndDropDownList.addAll(tmpList);						
			break;
		default:
			break;
		}
	}

	public List<SelectItem> getGeoEndDropDownList() {
		return this.geoEndDropDownList;
	}

	public void setGeoEndDropDownList(final List<SelectItem>
geoEndDropDownList) {
		this.geoEndDropDownList = geoEndDropDownList;
	}

	public PlanningPoint getGeoEndtDropDownSelected() {
		return this.geoEndtDropDownSelected;
	}

	public void setGeoEndtDropDownSelected(final PlanningPoint
geoEndtDropDownSelected) {
		this.geoEndtDropDownSelected = geoEndtDropDownSelected;
	}

	public List<SelectItem> getGeoStartDropDownList() {
		return this.geoStartDropDownList;
	}

	public void setGeoStartDropDownList(final List<SelectItem>
geoStartDropDownList) {
		this.geoStartDropDownList = geoStartDropDownList;
	}

	public PlanningPoint getGeoStartDropDownSelected() {
		return this.geoStartDropDownSelected;
	}

	public void setGeoStartDropDownSelected(final PlanningPoint
geoStartDropDownSelected) {
		this.geoStartDropDownSelected = geoStartDropDownSelected;
	}

	public boolean isRenderGeoDropDownStart() {
		return this.renderGeoDropDownStart;
	}

	public void setRenderGeoDropDownStart(final boolean renderGeoDropDownStart)
{
		this.renderGeoDropDownStart = renderGeoDropDownStart;
	}

	public boolean isRenderGeoDropDownEnd() {
		return this.renderGeoDropDownEnd;
	}

	public void setRenderGeoDropDownEnd(final boolean renderGeoDropDownEnd) {
		this.renderGeoDropDownEnd = renderGeoDropDownEnd;
	}
}


If I tried out this at the first (meaning loading values from one of the
renderGeoDropDownStart)  all work correctly but if I reload
renderGeoDropDownStart nothing occur - That means no CommandButton works or
the reloading is completed.

Faces Traces says:
Request Lifecycle:
Restore View (GREEN) --->	Apply Request (GREEN) --->	Validations (RED =
ERROR) ---> Update Model (GREY) --> Application (GREY) ---> Response (GREEN)

ERROR MESSAGES 
Component ID: subViewPlanning:fPlanning:planGeoDropdown1 
Severity: ERROR 
Message: subViewPlanning:fPlanning:planGeoDropdown1: Validierungsfehler:
Wert ist keine gültige Auswahl
(in english I think thats mean: validation error: value is not a valid
option)

someone know whats going wrong?

best regards
-- 
View this message in context: http://www.nabble.com/myFaces-1.2---Converter-Problem-tp15806504p15806504.html
Sent from the MyFaces - Users mailing list archive at Nabble.com.


Re: myFaces 1.2 - Converter Problem

Posted by Michael Kurz <mi...@gmx.at>.
MPF schrieb:
> ERROR MESSAGES 
> Component ID: subViewPlanning:fPlanning:planGeoDropdown1 
> Severity: ERROR 
> Message: subViewPlanning:fPlanning:planGeoDropdown1: Validierungsfehler:
> Wert ist keine gültige Auswahl
> (in english I think thats mean: validation error: value is not a valid
> option)
> 
> someone know whats going wrong?

Just a shot in the dark as I am not able to get your code running in 
reasonable time (there is too much missing).

It seems your converter works with "serialized" objects (using your 
custom serialization) but the list for the select box is filled with 
identifiers. This would also explain the exception you get: The list 
contains only ids but the value is a serialized object which naturally 
won't be part of the list.

You should only use ids or serialized values in both the managed bean 
property AND the list of select items.

I hope this helps you.

regards
Michael Kurz