Я написал пользовательский преобразователь следующим образом:р: OrderList преобразователь getAsObject() не вызывает Object.toString()
@FacesConverter(value = "orderListConverter")
public class OrderListConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
Object ret = null;
if (component instanceof OrderList) {
Object list = ((OrderList) component).getValue();
ArrayList<ExampleEntity> al = (ArrayList<ExampleEntity>) list;
for (Object o : al) {
String name = "" + ((ExampleEntity) o).getName();
if (value.equals(name)) {
ret = o;
break;
}
}
}
return ret;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value)
{
String str = "";
if (value instanceof ExampleEntity) {
str = "" + ((ExampleEntity) value).getNumber();
}
return str;
}
}
Мой ExampleEntity реализуется следующим образом:
public class ExampleEntity {
private String name;
private int number;
public ExampleEntity(String name, int number) {
this.name = name;
this.number = number;
}
@Override
public String toString() {
return "toString(): [name=" + name + ", number=" + number + "]";
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
OrderList-компонент из Primefaces выглядит следующим образом:
<p:orderList value="#{orderListBean.exampleList}"
var="exampleEntity" itemValue="#{exampleEntity}"
converter="orderListConverter">
<p:column style="width:25%">
#{exampleEntity.number}
</p:column>
<p:column style="width:75%;">
#{exampleEntity.name}
</p:column>
</p:orderList>
и боб реализуется следующим образом:
@SessionScoped
@ManagedBean(name = "orderListBean")
public class OrderListBean {
private List<ExampleEntity> exampleList;
@PostConstruct
public void init() {
exampleList = new ArrayList<ExampleEntity>();
exampleList.add(new ExampleEntity("nameOne", 1));
exampleList.add(new ExampleEntity("nameTwo", 2));
exampleList.add(new ExampleEntity("nameThree", 3));
exampleList.add(new ExampleEntity("nameFour", 4));
exampleList.add(new ExampleEntity("nameFive", 5));
}
public List<ExampleEntity> getExampleList() {
return exampleList;
}
public void setExampleList(List<ExampleEntity> exampleList) {
this.exampleList = exampleList;
}
}
1) при отладке, то value
Параметр getAsObject()
содержит number
из ExampleEntity
, но я ожидал, что метод ExampleEntity
toString()
называться!
2) Каков правильный контент для атрибута itemValue
? Это какая-то конвенция по конфигурации? Или как компонент «знает», чтобы использовать весь объект при вставке exampleEntity
в itemValue
Надеюсь, что все ясно! Танки много для любого объяснения!
Вопрос 2: Я понимаю, что 'exampleEntity' вернет весь объект. Но нет никакой аннотации или чего-либо еще (например, для Bean '(name =" beanName ")', так как я знаю, как писать правильное имя.Всегда ли это имя класса с нижним регистром? Было более или менее предположение написать 'exampleEntity' – bauz
@ bauz_69, в вашем' p: orderList' вы определяете 'значение', чтобы сказать« итерацию коллекции '# {orderListBean.exampleList}' "с помощью символа' var = "exampleEntity" ' как имя переменной цикла. Вы могли бы так же сделать его «var =» независимо от '' и 'itemValue =" # {wharever} "'. –