Можно ли создавать исключение для бизнес-проверок? - PullRequest
0 голосов
/ 08 июня 2019

Я занимаюсь разработкой приложения Java EE с использованием JSF, Bean Validation, EJB и т. Д. Я пытаюсь найти правильный способ проверки бизнеса.

Я использую проверку bean-компонентов для базовых сценариев (@NotNull, @Size и т. Д.), Но для сложных бизнес-проверок я решил использовать шаблон стратегии (пробовал с проверкой класса уровня, но он слишком многословен).Реализация следующая:

public void signUp(Company company, UserAccount userAccount) throws ValidationException {
    //Set the validations to be executed
    List<Validator> validatorsList = new ArrayList<>();
    validatorsList.add(new Validator1(company));
    validatorsList.add(new Validator2(userAccount, ejb2));

    //Execute the validations
    for (Validator validator : validatorsList) {
    if (!validator.validate()) {
        validator.throwException();
    }

    //Execute some logic
}

Приведенный выше код работает в EJB (Ejb1)

Интерфейс:

public interface Validator {

    public boolean validate();

    public void throwException() throws ValidationException;

}

Валидаторы:

public class Validator1 implements Validator {

    private Company company;

    public Validator1 (Company company) {
        this.company = company;
    }

    @Override
    public boolean validate() {
        return doSomething();
    }

    @Override
    public void throwException() throws ValidationException {
        throw new ValidationException2();
    }
}

public class Validator2 implements Validator {

    private Ejb1 ejb2;
    private Company company;

    public Validator2 (Company company, Ejb2 ejb2) {
        this.company = company;
        this.ejb2= ejb2;
    }

    @Override
    public boolean validate() {
        return ejb2.doSomething();
    }

    @Override
    public void throwException() throws ValidationException {
        throw new ValidationException2();
    }
}

Абстрактное исключение

public abstract class ValidationException extends Exception {

    private static final long serialVersionUID = 1L;

}

Конкретное исключение

@ApplicationException(rollback = true)
public static class ValidationException1 extends ValidationException 
    implements Serializable {

    private static final long serialVersionUID = 1L;

}

@ApplicationException(rollback = true)
public static class ValidationException2 extends ValidationException  
    implements Serializable {

    private static final long serialVersionUID = 1L;

}

Управляемый компонент JSF:

public String save() {
    try {
        this.ejb.signUp(this.company, this.user);
    }
    catch (ValidationException1 e) {
        //Show info message
    }
    catch (ValidationException2 e) {
        //Show info message
    }
    catch (Exception e) {
        //Show error message
    }

    return null;
}

Приведенный выше код работает хорошо, но яесть следующие вопросы:

  • Это ортодоксальное решение?
  • Можно ли передавать EJB в конструктор классов проверки?Если нет, каков правильный способ сделать это?
  • Было бы лучше вернуть какой-нибудь список ошибок вместо исключения броска?

Спасибо

...