Как ссылаться на запись коллекции Java из JSF 2 ManagedProperty?

У меня есть приложение, в котором есть bean-компонент, содержащий список контактов, на которые ссылаются различные объекты домена в приложении:

@ManagedBean
@SessionScoped
public class ContactHolder implements Serializable {
    private ArrayList<Contact> contactsList;
    //getters and setters...
}

Контакты можно создавать и добавлять в contactsList с различных страниц JSF, и на записи в этом списке необходимо ссылаться как на ManagedProperty в различных объектах домена во всем приложении. Например, посмотрите на некоторые из моих объектов домена:

@ManagedBean
public class Claim implements Serializable {
    private Contact insured; //needs to reference entry in contactsList
}

@ManagedBean
public class Vehicle implements Serializable {
    private Contact driver; //needs to reference entry in contactsList
}

Поскольку у пользователей будет выбор: выбрать из существующего контакта или создать новый для каждого объекта домена, на одну и ту же запись контакта в contactsList можно будет ссылаться более чем из одного объекта домена. Есть ли способ сослаться/вставить конкретную запись коллекции Java как ManagedProperty в JSF 2? Или есть лучший подход к этому сценарию?

Спасибо!


person holic87    schedule 19.09.2011    source источник


Ответы (1)


Теоретически я вижу способы, с помощью которых вы запоминаете и передаете индексы списков, но это в конечном итоге будет довольно неуклюжим.

Гораздо лучше, если вы ориентируетесь на контейнер с поддержкой Servlet 3.0/EL 2.2 (Tomcat 7, Glassfish 3 и т. д.), в котором поддерживается вызов методов с дополнительными аргументами, или вы можете установить JBoss EL, который добавляет такое же улучшение для EL 2.1, тогда вы сможете просто передать этот объект в качестве аргумента метода действия.

E.g.

<h:dataTable value="#{contactHolder.contacts}" var="contact">
    <h:column>
        <h:commandButton value="Claim" action="#{claim.doAction(contact)}" />
    </h:column>
</h:dataTable>

с управляемым компонентом Claim:

public void doAction(Contact contact) {
    // ...
}
person BalusC    schedule 19.09.2011
comment
Спасибо за быстрый ответ! - person holic87; 19.09.2011