Тип данных Primefaces не работает должным образом с компонентом ViewScoped или RequestScoped - PullRequest
0 голосов
/ 30 марта 2012

Я пишу страницу JSF 2, которая визуализирует данные из базы данных.
Когда я использую Primefaces, доступный для данных, с компонентом ViewScoped или RequestScoped, получающим значения из базы данных, он не работает должным образом - не сортирует и не разбивает на страницы. Например:

@ManagedBean
@ViewScoped
public class MyBean implements Serializable {

    private List<Animal> animals;

    public List<Animal> getAnimals() {
        if(animals == null) {
            animals = DataBaseConnector.getLastAnimals();
        }
        return animals;
    }
}

Когда я меняю ViewScoped на SessionScoped, он работает хорошо, но я хочу использовать его с RequestScope и ViewScope. Когда я использую тот же компонент с добавлением статических значений, как здесь:

@ManagedBean
@ViewScoped 
public class MyBean implements Serializable {

    private List<Animal> animals = new ArrayList<Animal>() {{
        add(new Animal("John", 7, new Timestamp(2436343516841235621L)));
        add(new Animal("Holly ", 15, new Timestamp(52343332153212142L)));
        add(new Animal("Betty", 3, new Timestamp(2346236232151232L)));
    }};

    public List<Animal> getAnimals() {
        return animals;
    }
}

Работает правильно - сортирует и разбивает на страницы. Могу ли я использовать простые данные с данными, которые bean-объект RequestScoped получает из базы данных?

Ответы [ 3 ]

1 голос
/ 30 марта 2012

Это может произойти, если вы привязываете свойства bean-объекта области видимости к атрибутам обработчика тега, что может привести к воссозданию bean-объекта области видимости при каждом HTTP-запросе. Обработчиками тегов являются теги JSTL, такие как <c:if>, <c:forEach> и т. Д., И теги пользовательского интерфейса Facelets, которые не имеют атрибута rendered, такие как <ui:include>, <ui:composition> и т. Д., И базовые компоненты JSF, такие как <f:attribute>, <f:validator> и т. Д. Необходимо убедиться, что вы не привязываете свойства bean-объекта области видимости к этим обработчикам тегов. Вместо этого вам нужно искать подход с использованием компонента пользовательского интерфейса JSF или разделять эти свойства на другой bean-объект с областью запроса.

Смотри также:


Не связано с конкретной проблемой, хотя ленивая загрузка в геттер не должна создавать проблем, предпочтительно делать это во время (после) построения поддерживающего компонента. Хотя имя класса DataBaseConnector и вызов статического метода не дают мне сильного ощущения, что вы делаете вещи с БД правильно.

0 голосов
/ 06 апреля 2012

Некоторое описание участвующих классов будет здесь полезно.

@Named
@ViewScoped
public class MyBean implements Serializable {

    private List<Animal> animals = null;

    public List<Animal> getAnimals() {
        if(animals == null) {
            animals = (new MyBean()).getLastAnimals();
        }
        return animals;
    }
}

Если вы обновите свой вопрос с источником в DatabaseConnector, вы получите желаемый ответ.Вероятно, вам нужен экземпляр MyBean внутри DatabaseConnector.Композиция, в которой у DatabaseConnector есть MyBean.

Доллары для пончиков. DatabaseConnector в настоящее время не имеет отношения "композиция" с MyBean.Или, если это так, то метод DatabaseConnector.getLastAnimals () не использует его.

0 голосов
/ 30 марта 2012

Может сработать, но лучше, если инструкция

 animals = DataBaseConnector.getLastAnimals();

находится внутри метода, аннотированного @ PostConstruct.

Тем не менее, я думаю, что лучшим вариантом является использование View beoped bean в вашем случае. Я делал это раньше, и это работало хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...