1

(这基本上是这个问题的后续。)

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

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

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为第一个请求注入并(非法)在后续请求中重用。(如果验证失败并且用户尝试再次提交表单,则会发生多次表单提交。)

我的问题

解决这个问题的最佳方法是什么?和我解决上一个类似问题的方法一样吗?在这种情况下,它无疑会变得更加混乱。

4

1 回答 1

0

您想要并且检票口使用的生命周期略有不同。

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

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

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

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

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

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

于 2013-06-25T16:00:57.667 回答