阿帕奇检票:在形式验证注入依赖(使用吉斯)(Apache Wicket: Injecting dep

2019-10-18 07:26发布

(这基本上是一个跟随这个问题 。)

我需要在我的表单验证的一个访问数据库服务层(以确保电子邮件注册新用户时,不已经采取)。

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

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

我怀疑,这个问题是由于我使用的开放式会话中的视图和多形式,提交跨越多个请求。 所述userService注入用于所述第一请求和(非法)在随后的请求重复使用。 (多表单提交如果验证失败,用户试图再次提交形式发生。)

我的问题

什么是解决这个的最好方法? 用同样的方法为我解决了以前, 类似的问题 ? 毫无疑问,这将得到梅西耶在这种情况下。

Answer 1:

还有就是你要有点不同的生命周期和检票口使用。

一是认为第一,了解检票组件instantion和注射:

  1. 实例的组件
  2. 调用注射器 - IComponentInstantionListener.onInstantiation(色差分量)
  3. 注入标注的字段
  4. 使用成分(渲染等)
  5. 下一个请求(S) - 使用相同的组分与注射字段

该怎么办? 使用注入到现场(S)的代理类。 当代理类调用它曾经使用当前的豆。

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

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

即使你必须写自己的实现或看向检票的Contrib或检票东西。



文章来源: Apache Wicket: Injecting dependencies in form validators (using Guice)