Validation ApacheWicket:在表单验证器中注入依赖项(使用Guice)

Validation ApacheWicket:在表单验证器中注入依赖项(使用Guice),validation,dependency-injection,wicket,guice,Validation,Dependency Injection,Wicket,Guice,(这基本上是一个后续步骤。) 我需要在我的一个表单验证器中访问DB服务层(以确保注册新用户时电子邮件尚未被接收) 我尝试了以下方法(为了简洁起见,省略了一些输入字段): 我怀疑这个问题是因为我在视图中使用了opensession,并且多个表单提交跨越了多个请求。userService为第一个请求注入,并(非法)在后续请求中重用。(如果验证失败且用户尝试再次提交表单,则会发生多次表单提交。) 我的问题 解决这个问题的最好办法是什么?和我解决前一个问题的方法一样?在这种情况下,它无疑会变得更加混乱。

(这基本上是一个后续步骤。)

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

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

我怀疑这个问题是因为我在视图中使用了opensession,并且多个表单提交跨越了多个请求。
userService
为第一个请求注入,并(非法)在后续请求中重用。(如果验证失败且用户尝试再次提交表单,则会发生多次表单提交。)

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

您想要的生命周期与wicket使用的生命周期略有不同

首先思考,了解Wicket组件实例和注入:

  • 实例组件
  • 调用注入器- iComponentInstallation.OnInstallation(组件组件)
  • 注入带注释的字段
  • 使用组件(渲染等)
  • 下一个请求-对注入的字段使用相同的组件
  • 怎么办? 使用注入到字段中的代理类。当代理类被调用时,它总是使用当前bean

    请参阅上的sprincomponentnejctor

    看 AnnotProxyFieldValueFactory位于


    即使您必须编写自己的实现,或者使用Wicket Contrib或Wicket之类的工具。

    因此,首先,我不使用Spring,但我想Guice的答案基本相同。你是不是建议我为服务注入一个代理,在每个请求中重新注入底层服务?是的,你已经知道了,这就是我的想法。在SpringComponentInjector中,它是正确实现的。它只注入代理,通过每个请求提供正确的bean/服务,即使组件与之前的请求相同。
    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