Как добавить сортировку в таблицу данных Apache Wicket с содержимым из Hibernate? - PullRequest
4 голосов
/ 21 октября 2011

У меня есть существующий DataTable, встроенный в Wicket 1.5, следующим образом:

Java-файл страницы.

public class ExamplePage extends WebPage {
public ExamplePage(){
List<IColumn<Example>> columns = new ArrayList<IColumn<Example>>();
columns.add(new PropertyColumn<Example>(Model.of("name"), "name"));
ExampleProvider provider = new ExampleProvider();

        DataTable<Example> exampleTable = new DataTable<Example>("exampleTable", columns, provider, 10);
        exampleTable.addTopToolbar(new HeadersToolbar(exampleTable, null));
        exampleTable.addBottomToolbar(new NavigationToolbar(exampleTable));
        add(exampleTable);
    }
}

Провайдер

public class ExampleProvider extends SortableDataProvider<Example> {
    @SpringBean
    ExampleDao exampleDao;

    public ExampleProvider() {
        Injector.get().inject(this);
    }

    @Override
    public Iterator<Example> iterator(int first, int count) {
        List<Example> examples = exampleDao.find(first, count);
        Iterator<Example> exampleIterator = examples.iterator();
        return exampleIterator;
    }

    @Override
    public IModel<Example> model(Example object) {
        return Model.of(object);
    }

    @Override
    public int size() {
        return exampleDao.count();
    }
}

HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"  
      xmlns:wicket="http://wicket.apache.org"  
      xml:lang="en"  
      lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <wicket:extend>
        <table wicket:id="exampleTable" />
    </wicket:extend>
</body>
</html>

Я попытался просто добавить параметр сортировки в PropertyColumn, чтобы столбец можно было щелкать, но он ничего не делал.

columns.add(new PropertyColumn<Example>(Model.of("name"), "name", "name"));

Это привело к следующей ошибке.

Last cause: null
WicketMessage: Exception in rendering component: [ [Component id = header]]

java.lang.NullPointerException
    at org.apache.wicket.extensions.markup.html.repeater.data.sort.OrderByLink$CssModifier.onComponentTag(OrderByLink.java:190)
    at org.apache.wicket.Component.renderComponentTag(Component.java:3885)
    at org.apache.wicket.Component.internalRenderComponent(Component.java:2506)
    at org.apache.wicket.MarkupContainer.onRender(MarkupContainer.java:1576)
    at org.apache.wicket.Component.internalRender(Component.java:2345)
    at org.apache.wicket.Component.render(Component.java:2273)
    at org.apache.wicket.MarkupContainer.renderNext(MarkupContainer.java:1474)
    ...

Я попытался добавить setSort (new SortParam ("name", true));в конструктор провайдера

Я также попытался добавить полный бэкэнд в DAO, чтобы была возвращена отсортированная часть таблицы.

Я также попытался добавить поле в файл свойствдля страницы, аналогичной первому ресурсу, расположенному внизу.

Все мои попытки приводят к одной и той же ошибке.Я думаю, что я упускаю что-то простое, но я проверил немало примеров и ничего не нашел.

Ресурсы, которые я уже проверил, включают следующее:

Ответы [ 2 ]

4 голосов
/ 13 ноября 2012

Вам необходимо определить пользовательский поставщик данных, расширив SortableDataProvider, а затем передать его в HeadersToolbar.Например:

new HeadersToolbar(exampleTable, exampleSortableDataProvider)
2 голосов
/ 23 октября 2011

Не передавайте 'null' на новом HeadersToolbar (exampleTable, null).

...