Hi Stefan,
change the converter to convert from and to id
and don't use the converter for the label.
e.g.:
List<SelectItem> items = new ArrayList<SelectItem>();
for (Person person : list) {
StringBuilder builder = new StringBuilder();
if (person.getSalutation() != null) {
builder.append(person.getSalutation().getName()).append(" ");
}
if (!StringUtils.isEmpty(person.getFirstname())) {
builder.append(person.getFirstname()).append(" ");
}
String label = builder.append(person.getLastname())
.append("(").append(person.getId()).append(")").toString();
items.add(new SelectItem(person, label));
}
and
public Object getAsObject(FacesContext context, UIComponent component,
String value) throws ConverterException {
if (StringUtils.isEmpty(value)) {
return null;
}
try {
int personId = Integer.parseInt(value);
return
ProjectManagementHelper.getProjectManagement().getPerson(personId);
}
} catch (NumberFormatException e) {
LOG.error("", e);
}
return null;
}
public String getAsString(FacesContext context, UIComponent component,
Object obj) throws ConverterException {
if (obj == null) {
LOG.info("###+++ received null value! +++###");
return null;
}
if (obj instanceof Person) {
LOG.info("###+++ received Person instance! +++###");
return ((Person) obj).getId();
}
throw new ConverterException("Expected " + Person.class.getName() +
", received " + obj.getClass().getName());
}
Regards,
Volker
2007/1/29, Stefan Hedtfeld <[EMAIL PROTECTED]>:
Hi,
I'm trying to display some complex values within a tx:selectOneChoice
element. What I've managed so far is the following:
1. The tag:
<tx:selectOneChoice
value="#{editorController.currentEntry.member}"
label="#{mainBundle.member}" >
<f:selectItems value="#{editorController.memberItems}" />
</tx:selectOneChoice>
2. The item list (memberItem):
...
// list is declared as List<Person> list above
...
List<SelectItem> items = new ArrayList<SelectItem>();
for (Person person : list) {
items.add(new SelectItem(person, converter.getAsString(person)));
}
return items;
3. The converter registered for the Person class (an instance of
Converter with an additional convenience method getAsString(Person p) -
this method is accessible from a caller through the second interface):
public class PersonConverter implements Converter,
AsStringConverter<Person> {
private static final Log LOG = LogFactory.getLog(PersonConverter.class);
public Object getAsObject(FacesContext context, UIComponent component,
String value) throws ConverterException {
if (StringUtils.isEmpty(value)) {
return null;
}
try {
int posOpen = value.lastIndexOf("(");
int posClose = value.lastIndexOf(")");
if (posOpen >= 0 && posClose > posOpen) {
String substring = value.substring(posOpen + 1, posClose);
LOG.info("#+#+# Substring = \"" + substring + "\"");
int personId = Integer.parseInt(substring);
return
ProjectManagementHelper.getProjectManagement().getPerson(personId);
}
} catch (NumberFormatException e) {
LOG.error("", e);
}
return null;
}
public String getAsString(FacesContext context, UIComponent component,
Object obj) throws ConverterException {
if (obj == null) {
LOG.info("###+++ received null value! +++###");
return null;
}
if (obj instanceof Person) {
LOG.info("###+++ received Person instance! +++###");
return getAsString((Person) obj);
}
throw new ConverterException("Expected " + Person.class.getName() +
", received " + obj.getClass().getName());
}
public String getAsString(Person person) {
StringBuilder builder = new StringBuilder();
if (person.getSalutation() != null) {
builder.append(person.getSalutation().getName()).append(" ");
}
if (!StringUtils.isEmpty(person.getFirstname())) {
builder.append(person.getFirstname()).append(" ");
}
return builder.append(person.getLastname()).append("
(").append(person.getId()).append(")").toString();
}
}
This at least works, but it is kind of ugly UI as I had to code the
object's internal id into the String displayed in the list. So my own
entry could be "Mr. Stefan Hedtfeld (2)" - which is not the intended
way. I'd like to simply display "Mr. Stefan Hedtfeld".
Is there a better way to handle this?
Regards,
Stefan.