Spring 双击似乎会中断导叶弹簧注射

Spring 双击似乎会中断导叶弹簧注射,spring,dependency-injection,wicket,user-input,double-click,Spring,Dependency Injection,Wicket,User Input,Double Click,我们的应用程序使用Wicket前端,通过Spring注入来加载DOA和管理事务 我们发现我们的几个用户正在双击链接/按钮,这是 不知怎的破坏了Spring注入,所以后续调用whateverDao.doStuffobj会抛出N.P.E.这个 应用程序在客户的内部网络上运行,目前,我们已礼貌地请求 客户在他们的团队中传播了这样一个信息:点击所有功能就可以了。但这是显而易见的 这正成为他们的一个问题 常见用例包括一个搜索屏幕,显示系统中当前所有Foo对象的列表, 如果需要,可以通过搜索参数对其进行过滤

我们的应用程序使用Wicket前端,通过Spring注入来加载DOA和管理事务

我们发现我们的几个用户正在双击链接/按钮,这是 不知怎的破坏了Spring注入,所以后续调用whateverDao.doStuffobj会抛出N.P.E.这个 应用程序在客户的内部网络上运行,目前,我们已礼貌地请求 客户在他们的团队中传播了这样一个信息:点击所有功能就可以了。但这是显而易见的 这正成为他们的一个问题

常见用例包括一个搜索屏幕,显示系统中当前所有Foo对象的列表, 如果需要,可以通过搜索参数对其进行过滤,并在单击某个项目时将用户带到 该特定Foo的详细信息页面,最初为只读模式。接下来,用户可以单击 角落中的编辑按钮切换到编辑模式。然后,用户可能会进行一些更改并 单击“保存”或可能单击“删除”以删除该项目

此场景涉及多达三个步骤的DAO调用: 1.在搜索页面上,单击项目时,加载该项目的基本详细信息。 2.在只读模式下的“详细信息”页面上,单击“编辑”以加载该项目的完整详细信息。 3a。在编辑模式下的“详细信息”页面上,单击“保存”以保留更改。 3b。在编辑模式下的“详细信息”页面上,单击“删除”以删除

在上述任何情况下,如果用户双击上一步,则下一步将生成 错误。可复制性约为33%,浏览器和操作系统之间存在一些差异

关于防止这种情况有什么见解吗

在下面的示例中,BasePage是Wicket包含菜单的网页的自定义扩展 PageType是创建、编辑和只读详细信息的枚举

搜索页面Java的示例代码如图所示,HTML是您所期望的:

import org.apache.wicket.spring.injection.annot.SpringBean;
// and other imports

public class FooManagerPage extends BasePage {

    @SpringBean
    private transient FooDao fooDao;

    public FooManagerPage() {
        SortableDataProvider<Foo> provider = new SortableDataProvider<Foo>(fooDao);

        add(new FeedbackPanel("feedback");

        final Form<Foo> searchFooForm = new Form<Foo>("searchFooForm",
            new CompoundPropertyModel<Foo>(new Foo()));

        // the form's search parameter's go here
        // with a 'search' button that filters table below

        add(searchFooForm)

        List<IColumn<Foo>> columns = new ArrayList<IColumn<Foo>>();
        columns.add(new PropertyColumn<Foo>(Model.of("Name"), "name", "name"));
        // a couple other columns here

        DataTable fooTable = new AjaxFallbackDefaultDataTable<Foo>("fooTable", columns, provider, 10){
            @Override
            protected Item<Foo> newRowItem(String id, int index, final IModel<Foo> model){
                Item<Foo> item = super.newRowItem(id, index, model);
                item.add(new AjaxEventBehavior ("onclick") {
                    @Override
                    protected void onEvent(AjaxRequestTarget target) {
                        Foo foo = fooDao.load(model.getObject().getId());
                        setResponsePage(new FooViewPage(foo, PageType.READ_ONLY));
                    }
                }); 
                return item;
            }
        };

        add(fooTable);
    }
}
查看页面Java的示例代码如图所示,HTML是您所期望的:

// several imports, including Spring Bean
public class FooFormPage extends BasePage {

    @SpringBean
    private transient fooDao fooDao;

    public FooFormPage(final Foo foo, PageType type) {
        Form<Foo> fooForm = new Form<Foo>("fooForm",
            new CompoundPropertyModel<Foo>(foo));

        // all of Foo's input elements go here
        // are enabled or disabled and sometimes invisible based on PageType

        add(fooForm);

        SubmitLink submitButton = new SubmitLink("save", fooForm){
            @Override
            public void onSubmit() {
                super.onSubmit();
                //***** A double click on the Edit button can cause fooDao to be N.P.E. here *****
                fooDao.save(createInitiativeForm.getModelObject().getId());
                changePageType(PageType.VIEW, createFooForm.getModelObject());
            }
        };
        add(submitButton);

        AjaxLink<Void> editButton = new AjaxLink<Void>("edit"){
            @Override
            public void onClick(AjaxRequestTarget target) {
                // reload the item from DB
                //***** A double click on Search Page item will cause fooDao to be N.P.E. here *****
                Foo foo = fooDao.load(fooForm.getModelObject().getId());
                setResponsePage(new FooPage(foo, PageType.EDIT));
            }
        };
        add(editButton);

        // some stuff here that makes save button invisible in READ_ONLY, and Edit visible only in READ_ONLY
        // delete button is similar (visible only in CREATE)
    }
}

不应将依赖项字段标记为瞬态,它们应沿页面序列化。wicket spring模块在组件/页面创建时将可序列化代理注入@SpringBean注释字段中,以便可以安全地序列化它们,而不必担心序列化依赖项本身。

依赖项字段不应标记为瞬态,它们应沿页面序列化。wicket spring模块在组件/页面创建时将可序列化代理注入@SpringBean注释字段中,这样它们就可以安全地序列化,而不用担心序列化依赖项本身。

我理解您的意思,因为DAO没有与页面一起序列化,所以可能会发生错误。但是,这些DAO本身是不可序列化的,这没关系。wicket spring模块将为DAO创建一个可序列化代理,即使它没有实现可序列化。该字段将包含对代理的引用,该代理应与页面一起序列化,而不是DAO。它将按需从Spring中查找真正的DAO引用,方式类似于LoadableDetachableModel。Noooooooo!:您不需要使DAO实现可序列化。wicket-spring集成将为您创建一个可序列化的代理!只要试着从字段中删除临时限定符,看看它是否有效。我们的最后两条注释是交叉的。事实上,我们在测试它时使用了serializable和unserializable,只要实例不是瞬态的,它就可以双向工作。再次感谢。我理解您的意思,因为DAO没有与页面一起序列化,所以可能会发生错误。但是,这些DAO本身是不可序列化的,这没关系。wicket spring模块将为DAO创建一个可序列化代理,即使它没有实现可序列化。该字段将包含对代理的引用,该代理应与页面一起序列化,而不是DAO。它将按需从Spring中查找真正的DAO引用,方式类似于LoadableDetachableModel。Noooooooo!:您不需要使DAO实现可序列化。wicket-spring集成将为您创建一个可序列化的代理!只要试着从字段中删除临时限定符,看看它是否有效。我们的最后两条注释是交叉的。事实上,我们在测试它时使用了serializable和unserializable,只要实例不是瞬态的,它就可以双向工作。再次感谢你。