【发布时间】: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