(这基本上是this question的后续版本。)
我需要在我的一个表单验证器中访问DB服务层(以确保在注册新用户时没有收到电子邮件)。
我尝试了以下方法(为简洁起见,省略了一些输入字段):
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?在这种情况下,它无疑会变得更加混乱。
发布于 2013-06-26 00:00:58
您想要的和wicket使用的生命周期略有不同。
首先,首先要了解Wicket组件的实例化和注入:
使用组件注入器实例component
该怎么办呢?使用注入到字段中的代理类。当代理类被调用时,它总是使用当前的bean。
请访问http://ci.apache.org/projects/wicket/apidocs/6.0.x/org/apache/wicket/spring/injection/annot/SpringComponentInjector.html查看SprinComponentInejctor
请访问http://ci.apache.org/projects/wicket/apidocs/6.0.x/org/apache/wicket/spring/injection/annot/AnnotProxyFieldValueFactory.html查看AnnotProxyFieldValueFactory
甚至你也必须编写自己的实现,或者寻找Wicket Contrib或Wicket之类的东西。
https://stackoverflow.com/questions/17285304
复制相似问题