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