Интеграция проверки javax с JavaFX - PullRequest
0 голосов
/ 13 сентября 2018

Я работал над несколькими проектами 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 / service / dao.Я вообще не использую FXML, все компоненты моего пользовательского интерфейса генерируются на чистой 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());
    }
}

Спасибо!

1 Ответ

0 голосов
/ 03 октября 2018

Итак, я получил довольно чистый результат.Во-первых, я получил класс валидатора, который выглядит примерно так:

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

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

Я использую Spring, чтобы сделать этот класс доступным для автопроводки:

@Bean
public EntityValidator entityValidator()
{
    return new EntityValidator();
}

Проверка бина идет как-токак это:

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 просто принимает набор ошибок и отображает первую ошибку в диалоговом окне ошибок.Поскольку я использую группы проверки, в наборе никогда не бывает более одной ошибки, так что все это выглядит довольно чисто.Это никогда не будет так просто, как с помощью контроллера в веб-проекте, но я очень доволен результатом в целом.

Приветствия

...