java - 将 javax 验证与 JavaFX 集成

标签 java spring spring-boot javafx bean-validation

我曾参与过几个 Spring MVC 项目,其中验证可以非常简单地完成,如下所示:

Controller

@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 与您可以称为 View /服务/dao 结构的结构一起使用。我根本不使用 FXML,我的 UI 组件都是用纯 Java 生成的,我打算保持这种状态。

如何以与 Spring MVC 类似的友好方法在我的实体上使用验证注释?

澄清

仅供引用,这就是我当前保存实体的方式。目前,在添加用户输入时,不会对用户的输入进行任何验证,但一切都运行得很好。我的实体都已注释并准备就绪,我只是想学习如何将好的 @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());
    }
}

谢谢!

最佳答案

所以我最终得到了一个非常干净的结果。首先,我最终得到了一个如下所示的 validator 类:

public class EntityValidator 
{
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    Validator validator = factory.getValidator();

    public Set<ConstraintViolation<Category>> validateCategory(Category category)
    {
        return validator.validate(category);
    }
}

我正在使用 Spring 使此类可用于 Autowiring :

@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 方法仅获取错误集并在错误对话框中显示第一个错误。由于我使用的是验证组,因此集合中永远不会出现多个错误,因此这一切看起来都非常干净。它永远不会像从网络项目中的 Controller 中执行它那么简单,但我对总体结果非常满意。

干杯

关于java - 将 javax 验证与 JavaFX 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52313966/

相关文章:

java - 为什么我的 .isEmpty 在此代码中不起作用?

java - 计算子字符串,while循环

java - @Autowired 和 default-autowire 可以共存吗?

java - 如何从 JWT token 身份验证获取声明值

spring-boot - Spring Cloud Eureka 服务器示例登录挑战

java - 修复 JComboBox 宽度

java - 如何在没有外部jar的情况下使用Java读取excel文件

Spring,sts在每次源更改时重新编译项目

java - 如何返回所有请求的索引页?

java - Spring Security 找不到数据源