JSF EL и списки

Andbar

Есть некий проект на Java Server Faces, содержащий кучу списков, с которыми надо делать однообразные действия. Чтобы не писать одно и то же, я запихнул основные действия и некоторые свойства (которые должны быть доступны в контексте EL-выражений в JSP-шке я запихнул основные свойства и действия в наследник ArrayList'а следующим образом (параметр шаблона - не просто объект, а наследник другого шаблонного класса):
MyList.java:
class MyList<E> extends ArrayList<E> {
String myProperty;
public MyList {
myProperty = "!";
}
public void onMyEvent(ActionEvent e) {
//some code
}
public String getMyProperty {
return myProperty;
}
}
В общем, при использовании этого шаблонного класса, количество служебного кода заметно уменьшилось, но когда я попытался использовать свойства и обработчики событий (типа "#{myBean.someMyListInstance.myProperty}" меня ждал облом: кидалось исключение что-то типа "у myBean.someMyListInstance нет свойства myProperty". А валидатор в eclipse считал подобные выражения ошибочными. Такое ощущение, что разборщик EL-выражения при получении объекта-списка считает его простым List'ом. Пока обошел проблему написанием прокси-класса, однако мб. есть более простое решение?

hiper-hoper

у myBean getSomeMyListInstance что возвращает?

Andbar

экземпляр MyList<SomeClass>. Если он будет возвращать экземпляр другого шаблонного класса, не реализующего интерфейс List, с соответствующими методами (прокси то всё заработает.
Короче, вот так не работает:
public class MyBean implements Serializeable {
  private MyList<SomeClass> v = new MyList<SomeClass>
  public MyBean {...}
  public MyList<SomeClass> getV {
    return v;
  }
}

А так - работает:
 
class MyListAccessor<E> {
  MyList<E> list;
  public MyListAccessor(MyList<E> list) {
    this.list = list;
  }
  public void onMyEvent(ActionEvent e) {
    list.onMyEvent(e);
  }
  public String getMyProperty {
    return list.getMyProperty;
  }
  public List<E> getList {
    return list;
  }
}
public class MyBean implements Serializeable {
  private MyList<SomeClass> v = new MyList<SomeClass>
  public MyBean {...}
  public MyListAccessor<SomeClass> getV {
    return new MyListAccessor<SomeClass>(v);
  }
}

 Только в последнем случае приходится писать не "#{myBean.v}", а "#{myBean.v.list}" там, где нужен именно список.

hiper-hoper

хмм, может ты не так понял - сигнатура у метода какая?

Andbar

хмм, может ты не так понял - сигнатура у метода какая?
добавил примеры

katrin2201

Такое ощущение, что разборщик EL-выражения при получении объекта-списка считает его простым List'ом.
Скорее всего так и есть. Если есть сурсы - просто подебажься, почти наверняка при разборе натолкнешься на что-нибудь вроде if (obj instanceof List) =)
Ну или кинь сюда свою имплементацию EL - поглядим =)
ЗЫ ты перешел на джаву? =)

Andbar

ЗЫ ты перешел на джаву? =)
с начала весны работаю на двух веб-проектах :grin:
Оставить комментарий
Имя или ник:
Комментарий: