问题
Hi every body I'm working on Primfaces pages and I have to make a selectOneMenu wich get items from dataBase so I tried to make it this way but I still have problem's with the converter
so my source Codes are the folowing :
selectOneMenu :
<p:selectOneMenu id="devises" required="true" value="#{pret.devise}" effect="fade" converter="devise">
<f:selectItem itemLabel="Select One" itemValue="" />
<f:selectItems value="#{devise.listDevise()}" var="devise" itemLabel="#{devise.nomDevise}" itemValue="#{devise}"/>
</p:selectOneMenu>
converter code:
@FacesConverter(value = "devise")
public class DeviseConverter implements Converter{
public static List<Devise> devises = Devise.listDevise();
public Object getAsObject(FacesContext facesContext, UIComponent component, String submittedValue) {
if (submittedValue.trim().equals("")) {
return null;
} else {
try {
int idDevise = Integer.parseInt(submittedValue);
for (Devise p : devises) {
if (p.getIdDevise()== idDevise) {
return p;
}
}
} catch(NumberFormatException exception) {
throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion Error", "Not a valid Devise"));
}
}
return null;
}
public String getAsString(FacesContext facesContext, UIComponent component, Object value) {
if (value == null || value.equals("")) {
return "";
} else {
return String.valueOf(((Devise) value).getIdDevise());
}
}
}
the error Code is : "devises: Validation Error: Value is not valid"
回答1:
Your object Devise
would need to contain equals()
and hashCode()
methods.
Also you can use this generic converter
which would workd for all the types of object and you won't need to write a converter for all the select lists.
import java.util.Map;
import java.util.Map.Entry;
import java.util.UUID;
import java.util.WeakHashMap;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
@FacesConverter(value = "entityConverter")
public class EntityConverter implements Converter {
private static Map<Object, String> entities = new WeakHashMap<Object, String>();
@Override
public String getAsString(FacesContext context, UIComponent component, Object entity) {
synchronized (entities) {
if (!entities.containsKey(entity)) {
String uuid = UUID.randomUUID().toString();
entities.put(entity, uuid);
return uuid;
} else {
return entities.get(entity);
}
}
}
@Override
public Object getAsObject(FacesContext context, UIComponent component, String uuid) {
for (Entry<Object, String> entry : entities.entrySet()) {
if (entry.getValue().equals(uuid)) {
return entry.getKey();
}
}
return null;
}
}
来源:https://stackoverflow.com/questions/17774367/selectonemenu-converter