【问题标题】:Apache Wicket: Injecting dependencies in form validators (using Guice)Apache Wicket:在表单验证器中注入依赖项(使用 Guice)
【发布时间】:2013-06-24 21:19:11
【问题描述】:

(这基本上是this question的后续。)

我需要在我的一个表单验证器中访问数据库服务层(以确保在注册新用户时尚未收到电子邮件)。

我尝试了以下方法(为简洁起见,省略了一些输入字段):

public class RegistrationPage extends WebPage {

    @Inject
    private UserService userService;

    public RegistrationPage() {

        add(new FeedbackPanel("feedback"));

        TextField<String> email = new TextField<String>("email", Model.of(""));

        ...

        email.add(new IValidator<String>() {

            @Override
            public void validate(IValidatable<String> validatable) {

                String email = validatable.getValue();

                if (userService.findUserByEmail(email) != null) {

                    // report error...

                }
            }
        });

        Form<?> form = new Form<Void>("registrationForm") { ... };

        form.add(email);
        add(form);
    }
}

不幸的是,这可能会导致

java.lang.IllegalStateException: EntityManager is closed

我怀疑问题是由于我正在使用 open-session-in-view 并且多个表单提交跨越多个请求。 userService 为第一个请求注入,并(非法)在后续请求中重用。 (如果验证失败并且用户尝试再次提交表单,则会发生多次表单提交。)

我的问题

解决此问题的最佳方法是什么?和我解决前面一样,similar problem?在这种情况下,它无疑会变得更加混乱。

【问题讨论】:

    标签: validation dependency-injection wicket guice


    【解决方案1】:

    您想要的以及 wicket 使用的生命周期略有不同。

    先想一想,了解Wicket组件的实例化和注入:

    1. 实例化组件
    2. 调用注入器 - IComponentInstantionListener.onInstantiation(组件组件)
    3. 注入带注释的字段
    4. 使用组件(渲染等)
    5. 下一个请求 - 使用带有注入字段的相同组件

    怎么办? 使用注入字段的代理类。当代理类被调用时,它会使用当前的 bean。

    请参阅 http://ci.apache.org/projects/wicket/apidocs/6.0.x/org/apache/wicket/spring/injection/annot/SpringComponentInjector.html 的 SprinComponentInejctor

    见 AnnotProxyFieldValueFactory http://ci.apache.org/projects/wicket/apidocs/6.0.x/org/apache/wicket/spring/injection/annot/AnnotProxyFieldValueFactory.html

    即使您必须编写自己的实现或查看 Wicket Contrib 或 Wicket Stuff。

    【讨论】:

    • 首先,我没有使用Spring,但我猜Guice的答案基本相同。您是否建议我为每个请求重新注入底层服务的服务注入一个代理?
    • 是的,你明白了,这就是想法。在 SpringComponentInjector 中它被正确实现。它只是注入为每个请求提供正确 bean/服务的代理,即使组件与之前的请求相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多