setRequired 和 addValidator 的区别

V7中,使用BeanValidator + FieldGroup,运行正常


		saveButton.addClickListener(new Button.ClickListener() {
			@Override
			public void buttonClick(Button.ClickEvent event) {
				try {
					//编辑的直接提交即可
					fg.commit();
					//新增的需要单独处理
					if(jpaitem.getEntity().getId() == null){
						Person p =fg.getItemDataSource().getEntity();
						persons.addEntity(p);
					}
					Notification.show("保存成功");
//					error.setVisible(false);
					PersonEditor.this.close();//关闭,防止再点击,重复增加
				} catch (FieldGroup.CommitException e) {
					for (Field<?> field: fg.getFields()) {
						ErrorMessage errMsg = ((AbstractField<?>)field).getErrorMessage();
						if (errMsg != null) {
							error.setValue("<div style='color:red'> " + field.getCaption() + ": " +  errMsg.getFormattedHtmlMessage() + "</div>");
							error.setVisible(true);
							break;
						}
					}
				}
			}
		});

但是我想让必填的字段增加上红色*号标识,使用setRequired(true)可以,但这样做之后,上面的for循环就不起作用了,找不到具体哪个字段验证错误了。
该怎么处理?setRequired 和 addValidator 的区别到底是什么?

如果只是想要“红色*号”的话,我觉得可以用CSS来做。看你的代码,验证做的有点间接,大概可以


try {
   for (Field<?> field : fg.getFields()) {
         field.validate();
   }
   fg.commit();
} catch (InvalidValueException e) {
   //处理验证失败     
}

这样的话,你的FOR循环应该也管用了,因为REQUIRED是VAADIN内建的一个验证机制,应该是很早就有了(V6),REQUIRED验证失败的话会抛出EmptyValueException,也是InvalidValueException的一种。

不过我也还没试,如果有错的话请指正。