将 javax 验证与 JavaFX 集成
Integrating javax validation with JavaFX
我从事过几个 Spring MVC 项目,在这些项目中验证可以像这样非常简单地完成:
控制器
@RequestMapping(value = {"/newHeightUnit"}, method = RequestMethod.POST)
public String saveHeightUnit(@Valid HeightUnit heightUnit, BindingResult result, ModelMap model)
{
boolean hasCustomErrors = validate(result, heightUnit);
if ((hasCustomErrors) || (result.hasErrors()))
{
setPermissions(model);
return "heightUnitDataAccess";
}
heightUnitService.save(heightUnit);
session.setAttribute("successMessage", "Successfully added height unit \"" + heightUnit.getName() + "\"!");
return "redirect:/heightUnits/list";
}
private boolean validate(BindingResult result, HeightUnit heightUnit)
{
boolean hasCustomErrors = false;
if (heightUnitService.nameExists(heightUnit))
{
FieldError error = new FieldError("heightUnit", "name", heightUnit.getName(), false, null, null,
heightUnit.getName() + " already exists!");
result.addError(error);
hasCustomErrors = true;
}
return hasCustomErrors;
}
这将根据实体具有的任何验证注释(@NotNull、@Size、@Digits 等)来验证实体。
如何在 JavaFX 中实现同样的效果?我有 9 个实体,它们都带有我在 MVC 项目中所做的验证注释。我正在使用 Spring 和你可以称之为视图/服务/dao 结构的东西。我根本不使用 FXML,我的 UI 组件都是纯 Java 生成的,我希望它保持这种状态。
如何以与 Spring MVC 类似的友好方式在我的实体上使用验证注释?
澄清
仅供参考,我的实体目前是这样保存的。当前在添加用户输入时没有对用户输入进行任何验证,但一切正常。我的实体都已注释并准备就绪,我只是想学习如何将好的 ol'@Valid
整合到组合中:
@Override
public void saveEntity()
{
TextField nameField = (TextField)formFields.get(0);
try
{
Category newCategory = new Category(null, nameField.getText(), new Date(), null);
categoryService.save(newCategory);
}
catch (Exception ex)
{
logger.error("Error adding category : " + ex.getMessage());
}
}
谢谢!
所以我得到了一个非常干净的结果。首先,我得到了一个验证器 class,看起来像这样:
public class EntityValidator
{
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
public Set<ConstraintViolation<Category>> validateCategory(Category category)
{
return validator.validate(category);
}
}
我正在使用 Spring 使这个 class 可用于自动装配:
@Bean
public EntityValidator entityValidator()
{
return new EntityValidator();
}
bean 验证是这样的:
TextField nameField = (TextField)formFields.get(0);
try
{
Category newCategory = new Category(null, nameField.getText(), new Date(), null);
Set<ConstraintViolation<Category>> errors = validator.validateCategory(newCategory);
if (errors.isEmpty())
{
categoryService.save(newCategory);
close();
}
else
{
showErrorMessages(errors);
}
}
catch (Exception ex)
{
logger.error("Error adding category : " + ex.getMessage());
}
showErrorMessages 方法只获取错误集并在错误对话框中显示第一个错误。由于我使用的是验证组,所以 Set 中的错误永远不会超过一个,所以这一切看起来都很干净。它永远不会像从网络项目中的控制器那样简单,但我对整体结果非常满意。
干杯
我从事过几个 Spring MVC 项目,在这些项目中验证可以像这样非常简单地完成:
控制器
@RequestMapping(value = {"/newHeightUnit"}, method = RequestMethod.POST)
public String saveHeightUnit(@Valid HeightUnit heightUnit, BindingResult result, ModelMap model)
{
boolean hasCustomErrors = validate(result, heightUnit);
if ((hasCustomErrors) || (result.hasErrors()))
{
setPermissions(model);
return "heightUnitDataAccess";
}
heightUnitService.save(heightUnit);
session.setAttribute("successMessage", "Successfully added height unit \"" + heightUnit.getName() + "\"!");
return "redirect:/heightUnits/list";
}
private boolean validate(BindingResult result, HeightUnit heightUnit)
{
boolean hasCustomErrors = false;
if (heightUnitService.nameExists(heightUnit))
{
FieldError error = new FieldError("heightUnit", "name", heightUnit.getName(), false, null, null,
heightUnit.getName() + " already exists!");
result.addError(error);
hasCustomErrors = true;
}
return hasCustomErrors;
}
这将根据实体具有的任何验证注释(@NotNull、@Size、@Digits 等)来验证实体。
如何在 JavaFX 中实现同样的效果?我有 9 个实体,它们都带有我在 MVC 项目中所做的验证注释。我正在使用 Spring 和你可以称之为视图/服务/dao 结构的东西。我根本不使用 FXML,我的 UI 组件都是纯 Java 生成的,我希望它保持这种状态。
如何以与 Spring MVC 类似的友好方式在我的实体上使用验证注释?
澄清
仅供参考,我的实体目前是这样保存的。当前在添加用户输入时没有对用户输入进行任何验证,但一切正常。我的实体都已注释并准备就绪,我只是想学习如何将好的 ol'@Valid
整合到组合中:
@Override
public void saveEntity()
{
TextField nameField = (TextField)formFields.get(0);
try
{
Category newCategory = new Category(null, nameField.getText(), new Date(), null);
categoryService.save(newCategory);
}
catch (Exception ex)
{
logger.error("Error adding category : " + ex.getMessage());
}
}
谢谢!
所以我得到了一个非常干净的结果。首先,我得到了一个验证器 class,看起来像这样:
public class EntityValidator
{
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
public Set<ConstraintViolation<Category>> validateCategory(Category category)
{
return validator.validate(category);
}
}
我正在使用 Spring 使这个 class 可用于自动装配:
@Bean
public EntityValidator entityValidator()
{
return new EntityValidator();
}
bean 验证是这样的:
TextField nameField = (TextField)formFields.get(0);
try
{
Category newCategory = new Category(null, nameField.getText(), new Date(), null);
Set<ConstraintViolation<Category>> errors = validator.validateCategory(newCategory);
if (errors.isEmpty())
{
categoryService.save(newCategory);
close();
}
else
{
showErrorMessages(errors);
}
}
catch (Exception ex)
{
logger.error("Error adding category : " + ex.getMessage());
}
showErrorMessages 方法只获取错误集并在错误对话框中显示第一个错误。由于我使用的是验证组,所以 Set 中的错误永远不会超过一个,所以这一切看起来都很干净。它永远不会像从网络项目中的控制器那样简单,但我对整体结果非常满意。
干杯