2015-05-29 4 views
1

Я написал пользовательский преобразователь следующим образом:р: 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

Конвертеры в основном служат для преобразования значений в 2-х направлениях:

  1. сервера к клиенту, когда значение визуализируется.
  2. Клиент к серверу при отправке значения.

В вашей getAsString вы установили, что строковое представление, тот, который использует клиент, это exampleEntity Номер. Таким образом, это то, что передается клиенту как ценность. И позже, когда клиент отправляет свое значение, это значение равно number. Чтобы преобразовать его в представление объекта (сервера), введите getAsObject с параметром number.
Сервер не может позвонить getAsObject с exampleEntity.toString(), потому что он не имеет экземпляра exampleEntity в тот момент, только отправленный number.

Для иллюстрации, это должно провести:

obj.equals(conv.getAsObject(ctx, comp, conv.getAsString(ctx, comp, obj))); 

getAsObject и getAsString должен быть инверсивными в их входе и выходе.

Чтобы ответить на ваш второй вопрос: это зависит от ваших потребностей. Вы могли бы сказать itemValue="#{exampleEntity.number}", но это имело бы смысл, только если вас не интересует сам exampleEntity, т. Е. На отправке вы получите number от клиента, и это все, что вам нужно для вашей серверной логики.

+0

Вопрос 2: Я понимаю, что 'exampleEntity' вернет весь объект. Но нет никакой аннотации или чего-либо еще (например, для Bean '(name =" beanName ")', так как я знаю, как писать правильное имя.Всегда ли это имя класса с нижним регистром? Было более или менее предположение написать 'exampleEntity' – bauz

+1

@ bauz_69, в вашем' p: orderList' вы определяете 'значение', чтобы сказать« итерацию коллекции '# {orderListBean.exampleList}' "с помощью символа' var = "exampleEntity" ' как имя переменной цикла. Вы могли бы так же сделать его «var =» независимо от '' и 'itemValue =" # {wharever} "'. –