В Primefaces Datatable не выполняется сортировка с помощью sortBy по столбцу

#primefaces #primefaces-datatable

#primefaces #primefaces-datatable

Вопрос:

Я решил спросить здесь, чтобы решить свою проблему. Прежде чем я напишу вам, я могу заверить вас, что я много гуглил, но ответа не нашел.

В моем случае В PRIMEFACES sortBy и filterBy в столбце p: в p:DataTable не работают.

Давайте начнем с сортировки. () Во всех версиях, которые я пробовал, как вы видите в следующем pom.xml : 6.2, 7.0, 7.0.RC3, 8.0, 8.0.RC3, он имеет следующее поведение: он отображает текст заголовка столбца с двумя стрелками вверх / вниз. Когда я нажимаю на стрелки, они НЕ меняются на «вверх» после «вниз». И, очевидно, НИКАКОЙ СОРТИРОВКИ не происходит. () Только в версиях, которые вы видите в следующем pom.xml: 6.0, 6.1 у него такое поведение: он отображает текст заголовка столбца с двумя стрелками вверх / вниз. Когда я нажимаю на стрелки, они меняют «вверх» после «вниз». Но опять же, СОРТИРОВКА не выполняется.

В некоторых сообщениях говорилось, что сначала я должен применить фильтрацию, а в отфильтрованном списке произвести сортировку. Я пробовал с помощью filterBy… Фильтрация не сработала, и сортировки нет… Волшебная вещь заключается в том, что фильтр не работал во всех ранее упомянутых версиях…

Далее я записываю все файлы, которые я использовал… Я использую Spring MVC 5.2.1 (Spring beans), Hibernate 5.4.3 / JPA, JSF 2.2.20, Primefaces. Я попытался воспроизвести пример «Primefaces Showcase / DataTable / Sorting».

————— pom.xml —————

 <dependency>
    <groupId>com.sun.faces</groupId>
    <artifactId>jsf-api</artifactId>
    <version>2.2.20</version>
</dependency>
<dependency>
    <groupId>com.sun.faces</groupId>
    <artifactId>jsf-impl</artifactId>
    <version>2.2.20</version>
</dependency>
<dependency>
    <groupId>org.primefaces</groupId>
    <artifactId>primefaces</artifactId>
    <version>8.0.RC3</version>
    <!-- <version>8.0</version> -->
    <!-- <version>7.0</version> -->
    <!-- <version>7.0.RC3</version> -->
    <!-- <version>6.0</version> -->
    <!-- <version>6.1</version> -->
    <!-- <version>6.2</version> -->
</dependency>
  

————— page_table.xml —————

Здесь я попробовал только сортировку в первом столбце и фильтрацию над сортировкой во втором столбце.

 <h:form>
<p:dataTable var="car" value="#{sortViewBackingBean.cars}">
    <f:facet name="header">
        Single Column Sort
    </f:facet>
    <p:column headerText="Id" sortBy="#{car.id}">
        <h:outputText value="#{car.id}"/>
    </p:column>
    <p:column headerText="Year" sortBy="#{car.year}" filterBy="#{car.year}">
        <h:outputText value="#{car.year}"/>
    </p:column>
</p:dataTable>
</h:form>
  

————— Модель автомобиля —————

 public class Car {
    private String id;
    private String brand;
    private int year;
    private String color;
    private int price;
    private boolean soldState;
    
    // Constructors, Getters, Setters
}
  

————— CarService —————

 @Service(value = "carService")
public class CarService {
    private final static String[] colors;
    private final static String[] brands;
    // Populate colors, brands

    public List<Car> createCars(int size) {
        List<Car> list = new ArrayList<>();
        for (int i = 0; i < size; i  ) {
            list.add(new Car(getRandomId(), getRandomBrand(), getRandomYear(),
                    getRandomColor(), getRandomPrice(), getRandomSoldState()));
        }
        return list;
    }
    // Other methods
}
  

————— CarService —————

Here is the heart of the code…
As I wrote I use Spring beans (the first 2 annotations in the SortViewBackingBean).
But, I overrode the Spring way, and I used CDI the one time / JSF way the other time,
but it did not work as well (the commented annotations in the SortViewBackingBean).

Сейчас я покажу вам, как я добавляю в DataTable список «автомобили». Погуглив, я обнаружил, что сортировка может работать, только если мы передаем datatable с тем же списком. Если каждый раз список отличается, сортировка не работает… Вот почему, как вы видите в следующем коде, в 2 версиях… Ни одна из этих версий не работает…

————— SortViewBackingBean версия 1 —————

 @Component(value = "sortViewBackingBean")
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
/*
I overrode the Spring way, and I used CDI/JSF way, but it did not work as well
@Named("sortViewBackingBean")
@ManagedBean("sortViewBackingBean")
@ViewScoped
@SessionScoped
*/
public class SortViewBackingBean implements Serializable {
    private final List<Car> cars;
    private CarService carService;

    public SortViewBackingBean(CarService carService) {
        this.carService = carService;
// At creation of the bean, the cars is created once only!
        cars = this.carService.createCars(10);
    }

    @PostConstruct
    public void init() {
//      Or this version, as is in the primefaces showcase
//        cars = carService.createCars(10);
    }

    public List<Car> getCars() {
        return cars;
    }

    public void setService(CarService carService) {
        this.carService = carService;
    }
}
  

————— SortViewBackingBean версия 2 —————

 @Component(value = "sortViewBackingBean")
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class SortViewBackingBean implements Serializable {
    private List<Car> cars;
    private CarService carService;

    public SortViewBackingBean(CarService carService) {
        this.carService = carService;
    }

//  Or this version I found googling, the cars is created once only!
    public List<Car> getCars() {
        if (cars == null) {
            cars = this.carService.createCars(10);
        }
        return cars;
    }

    public void setService(CarService carService) {
        this.carService = carService;
    }
}
  

Итак, ок!
Эти функции в Primefaces работают, или это только у меня!
Кто-нибудь может помочь в этом, пожалуйста?

Большое спасибо

Комментарии:

1. ухххх … 8.0RC3 — это кандидат для реального использования, он старше 8.0. О, и JSF и Spring MCV являются «конкурирующими» технологиями.

2. Привет, Кукельтье. Я также пробовал 8.0. Я также пробовал ManagedBean. Ничего не работает, кроме версий 6.0, 6.1. Но они работали с иконками. Сортировка также отсутствует

Ответ №1:

Исходя из вашего кода: вам нужно использовать область длиннее, чем запрос, например viewscope или sessionscope (не оба), чтобы сохранить filteredValue, чтобы отфильтрованный список оставался доступным после фильтрации. например

 @Named("sortViewBackingBean")
@SessionScoped
  

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

 <p:dataTable var="car" value="#{carBean.cars}" sortMode="multiple">
    //columns
</p:dataTable>
  

Комментарии:

1. Привет, Луис Галаз. Спасибо за ответ. Я только что попробовал то, что вы предложили. Я поставил SessionScoped… Это не работает. О режиме сортировки я знаю. Я также не выполнял работу с несколькими…

2. можете ли вы удалить filterBy=»#{car.year}» и проверить, работает ли сортировка?

3. Я пытался. Это не работает… Имейте в виду, Luis, что я пробовал это в обеих версиях 8.0, 6.0… В версиях 6.0, 6.1 стрелки сортировки вверх / вниз меняются и реагируют на щелчок (сортировка не работает), но во всех других версиях стрелки остаются мертвыми, как на мертвом изображении…