我在 Primefaces 中遇到了 filterBy 和 sortBy 的奇怪行为,其中 filterBy 本身工作正常,而 sortBy 本身也工作正常。我什至可以按一列对数据表进行排序,然后进行过滤。但我无法先过滤然后再排序。
我认为核心问题是,我在值列表中使用了中间数据结构。我会试着举个例子。我有一堂课Person
:
public class Person {
private String name;
...
}
在List<Person>
我的 Bean 中,排序和过滤工作正常。
现在我有一个额外的类Pet
,它属于一个Person
.
因此,有一个数据结构Pair<T1, T2>
对这种归属进行建模(不幸的是,我无法更改这种设计)。该数据结构的实现如下所示:
public class Pair<T1, T2> {
private T1 fst;
private T2 snd;
public Pair(T1 fst, T2 snd) {...}
//Setter & Getter
public Pair() {} // Must've created the default constructor,
// because otherwise I got an InstantiationException when filtering
}
所以最后在我的 Bean 中,我有一个List<Pair<Person, Pet>>
,它显示在数据表中。
如上所述,过滤器(例如通过 person.name)工作正常。也排序(例如按名称工作正常)。唯一的问题是当第一次过滤然后按一列排序时,我得到一个 NullPointerException 用于数据表中的单个条目。
对正在发生的事情的分析表明,在过滤然后排序之后,Pair
调用的默认构造函数(唯一一次;不是在单次过滤期间,不是在单次排序期间,在其他情况下都没有),似乎导致了一个空对(因为二传手也没有被调用)。
有谁知道,为什么在那里调用默认构造函数?即使在这种List<Person>
情况下,过滤后排序时也不会调用 Person 的默认构造函数。