[英]Bean Validation doesn't work?
我正在尋找解決問題的方法,但仍然沒有找到。 在我的bean中,我正在使用注釋進行驗證,但無法正常工作,並且我正在尋找所有的互聯網來完成這項工作。
我正在使用:Vaadin 7和Maven
我做這個
/** person's bean */
@Entity
public class Person{
@Id
@GeneratedValue
private Integer id;
@NotNull
@NotEmpty
@Size(min=5, max=50, message="insert first name")
private String firstName;
@NotNull
@NotEmpty
@Email private String email;
//get and set
}
//my app
public class LoginView extends VerticalLayout{
private TextField firstName, email;
private BeanFieldGroup<Person> binder;
private FormLayout form;
public LoginView(){
form = new FormLayout();
binder = new BeanFieldGroup<Person>(Person.class);
Field<?> field = null;
field = binder.buildAndBind("Firstname", "firstName");
firstName = (TextField)binder.getField("firstName");
form.addComponent(firstName);
field = binder.buildAndBind("Email", "email");
email = (TextField)binder.getField("email");
form.addComponent(email);
this.addComponent(form);
}
}
我該怎么做?
/** maven dependecy */
<dependency>
<groupId>com.vaadin.addon</groupId>
<artifactId>beanvalidation-addon</artifactId>
<version>0.6.2</version>
</dependency>
/** exception */
java.lang.NoSuchMethodError: com.vaadin.event.EventRouter.fireEvent(Ljava/util/EventObject;Lcom/vaadin/server/ErrorHandler;)V
at com.vaadin.server.VaadinService.onVaadinSessionStarted(VaadinService.java:783)
at com.vaadin.server.VaadinService.createAndRegisterSession(VaadinService.java:740)
at com.vaadin.server.VaadinService.doFindOrCreateVaadinSession(VaadinService.java:696)
at com.vaadin.server.VaadinService.findOrCreateVaadinSession(VaadinService.java:637)
at com.vaadin.server.VaadinService.findVaadinSession(VaadinService.java:501)
at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1376)
at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:238)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
好了,找到正確的實現。 最后我將向您展示代碼。 你需要做什么:
這是代碼:
@Theme("mytheme")
public class MyVaadinUI extends UI {
private Field firstName, email;
private FormLayout form;
@Override
public void init(VaadinRequest request){
VerticalLayout layout = new VerticalLayout();
//1. set a propertyitem for the fieldgroup
final BeanFieldGroup<Person> binder = new BeanFieldGroup<Person>(Person.class);
binder.setItemDataSource(new BeanItem<Person>(new Person()));
form = new FormLayout();
//2. don't use field Field, it's useless
firstName = binder.buildAndBind("Firstname", "firstName");
email = binder.buildAndBind("Email", "email");
form.addComponent(firstName);
form.addComponent(email);
layout.addComponent(form);
//3. add a button to submit the form
form.addComponent(new Button("OK", new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
try {
binder.commit();
Notification.show("Thanks!");
} catch (FieldGroup.CommitException e) {
Notification.show("You fail!");
}
}
}));
setContent(layout);
}
}
大家知道,我使用了兩個不同的依賴項,但是您應該首先嘗試使用自己的依賴項。 只需更改代碼,看看會發生什么。 這些是我使用的依賴項:
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
<version>1.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.0.Final</version>
</dependency>
好的,就像我說的那樣,您需要使用Vaadin的Bean Validation插件中提供的BeanValidationForm。
下面是一個示例:
@Theme("mytheme")
public class MyVaadinUI extends UI {
@Override
public void init(VaadinRequest request){
VerticalLayout layout = new VerticalLayout();
Person bean = new Person();
final BeanValidationForm<Person> form = new BeanValidationForm<Person>(
Person.class);
// show null values as empty strings
form.setFormFieldFactory(new DefaultFieldFactory() {
@Override
public Field createField(Item item, Object propertyId,
Component uiContext) {
Field field = super.createField(item, propertyId, uiContext);
if (field instanceof TextField) {
((TextField) field).setNullRepresentation("");
}
return field;
}
});
// use a BeanItem<BeanToValidate> for full validation
form.setItemDataSource(new BeanItem<Person>(bean));
// validate immediately when field focus lost but use explicit commit
form.setImmediate(true);
form.setWriteThrough(false);
layout.addComponent(form);
// explicit validation button
Button validate = new Button("Validate");
validate.addListener(new Button.ClickListener() {
public void buttonClick(ClickEvent event) {
try {
form.validate();
Notification.show("Validation successful");
} catch (Validator.InvalidValueException e) {
Notification.show(
"Validation failed: " + e.getMessage(),
Notification.TYPE_WARNING_MESSAGE);
}
}
});
layout.addComponent(validate);
setContent(layout);
}
}
我將其添加為答案,因為我認為這將阻止您嘗試完全使用Bean驗證插件。
問題在於Bean驗證插件僅與Vaadin 6+版本兼容(我最近剛剛在插件頁面上查看了其兼容性):
我正在猜測,因為您使用vaadin7標記了此問題,所以您正在使用Vaadin7。因此您無法使用此插件,因此會出現異常。
您需要尋找另一種為您的bean提供驗證的方法。 一種方法是將自定義Validator實例添加到您的字段中。 查看Vaadin書籍頁面的Bean驗證部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.