【问题标题】:wicket - PageableListView does not workwicket - PageableListView 不起作用
【发布时间】:2013-03-09 09:09:17
【问题描述】:

我正在处理检票口,我应该在点击导航栏后呈现 vthe 视图没有任何反应 请帮帮我。

<div class="colums data" wicket:id="BooksListViewContainer">

    <div wicket:id="booksListView">
        <div class="col-left data" wicket:id="bookName"></div>
        <div class="col-middle data" wicket:id="author"></div>
        <div class="col-middle data" wicket:id="genre"></div>
        <div class="col-middle data" wicket:id="language"></div>
        <div class="col-middle data" wicket:id="datePublished"></div>
    </div>
    <div wicket:id="navigator" class="navi">xxx</div>
</div>

和java:

 public class HomePage extends WebPage {

    transient LibaryServices libaryService ;
    Component sortBtns [] ;

public HomePage(final PageParameters parameters) {
    super(parameters);
    initPage();
}

private void initPage() {
    libaryService = new LibaryServices();
    add(getBooksListViewContainer());
}

private WebMarkupContainer getBooksListViewContainer(){
    String id = "BooksListViewContainer" ;
    WebMarkupContainer c = (WebMarkupContainer) get(id);
    if (c != null)
        return c;

    final WebMarkupContainer container = new WebMarkupContainer(id);
    container.add(getBooksListView());
    container.add(getNavigator());
    container.setOutputMarkupId(true);
    return container;
}

@SuppressWarnings("unchecked")
private PageableListView<Book> getBooksListView() {
    String id = "booksListView";
    PageableListView<Book> c = (PageableListView<Book>)get(id);
    if (c != null)
        return c;
    final PageableListView<Book> booksListView = new PageableListView<Book>(id, libaryService.getBooks(), 4) {
        @Override
        protected void populateItem(ListItem<Book> listBookItem) {
            Book book = (Book) listBookItem.getModelObject();

            listBookItem.add(new Label("author", book.getAuthor()));
            listBookItem.add(new Label("bookName", book.getBookName()));
            listBookItem.add(new Label("language", book.getBookLanguage()));
            listBookItem.add(new Label("genre", book.getGenre()));
            listBookItem.add(new Label("datePublished", book.getDatePublished()));

            listBookItem.setVisible(listBookItem.isVisible()&&
                        book.isShouldBeDisplayedAfterPassFilter());     
        }
        @Override
        protected IModel<Book> getListItemModel(
                IModel<? extends List<Book>> listViewModel, int index) {
            return super.getListItemModel(listViewModel, index);
        }
    };
    booksListView.setOutputMarkupId(true);
    booksListView.setMarkupId(id);
    return booksListView;
}
    public SortingDataUtil getSortingDataUtil(){
    return SortingDataUtil.getInstace();
}

private AjaxPagingNavigator getNavigator() {
String id = "navigator";
AjaxPagingNavigator navigator = (AjaxPagingNavigator) get(id);
if (navigator == null) {
    navigator = new AjaxPagingNavigator(id, getBooksListView()) {
    @Override
    protected void onAjaxEvent(AjaxRequestTarget target) {
        super.onAjaxEvent(target);
    }
    };
    navigator.setOutputMarkupId(true);
}
return navigator;
}       

}

这是我得到的例外

意外的运行时异常

  Last cause: Argument 'component' may not be null.
 WicketMessage: Method onRequest of interface      org.apache.wicket.behavior.IBehaviorListener targeted at      org.apache.wicket.ajax.markup.html.navigation.paging.AjaxPagingNavigationLink$1@321af6fe on component [AjaxPagingNavigationLink [Component id = pageLink]] threw an exception

堆栈跟踪

根本原因:

 java.lang.IllegalArgumentException: Argument 'component' may not be null.
 at org.apache.wicket.util.lang.Args.notNull(Args.java:41)
 at org.apache.wicket.ajax.AjaxRequestHandler.add(AjaxRequestHandler.java:226)
 at org.apache.wicket.ajax.markup.html.navigation.paging.AjaxPagingNavigator.onAjaxEvent(AjaxPagingNavigator.java:152)
 at com.wicketlibary.HomePage$3.onAjaxEvent(HomePage.java:146)
 at org.apache.wicket.ajax.markup.html.navigation.paging.AjaxPagingNavigationBehavior.onEvent(AjaxPagingNavigationBehavior.java:82)
 at org.apache.wicket.ajax.AjaxEventBehavior.respond(AjaxEventBehavior.java:131)
 at org.apache.wicket.ajax.AbstractDefaultAjaxBehavior.onRequest(AbstractDefaultAjaxBehavior.java:603)

编辑:我的版本是

  <wicket.version>6.6.0</wicket.version>

【问题讨论】:

  • 从您的堆栈跟踪中很难跟踪错误,但如果某些内容为空,则应该很容易在调试器上捕获它。
  • 我咳了一声,明白了问题所在,我认为这是基础设施的问题或上面的问题,我认为这是检票口错误……但如果有人发现我错了,请告诉我
  • 从堆栈跟踪看来,AjaxPagingNavigator 是使用 null 作为第二个参数构造的。从您的源代码中,我无法完全弄清楚这应该如何发生,但是当您使用的模式 (get(id)-return-if-not-null-construct-otherwise) 对我来说似乎有问题时,可能会有问题...

标签: java wicket wicket-1.5


【解决方案1】:

如果您认为这是一个错误,您应该创建一个快速入门并提交。

在您这样做之前,我将更改您获取 PageableListView 引用的方式,而是创建一个类变量,设置它并在创建 AjaxPagingNavigator 时使用它。当从 AjaxPagingNavigator 调用时,您是否使用调试来确保“c”不为空。我使用与您相同的检票口版本在我的环境中工作。我的代码中唯一的区别是我没有通过调用 get(id) 来获取我的变量

【讨论】:

  • 那么获取 Component 的最佳做法是什么?
  • 我想这取决于,只要您正确使用模型,您就可以将组件作为类变量,这应该没什么大不了的。您还可以将引用传递给不同的方法。你的问题解决了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多