(这基本上是这个问题的后续。)
我需要在我的表单验证器之一中访问数据库服务层(以确保在注册新用户时尚未收到电子邮件)。
我尝试了以下方法(为简洁起见,省略了一些输入字段):
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
为第一个请求注入并(非法)在后续请求中重用。(如果验证失败并且用户尝试再次提交表单,则会发生多次表单提交。)
我的问题
解决这个问题的最佳方法是什么?和我解决上一个类似问题的方法一样吗?在这种情况下,它无疑会变得更加混乱。