Я занимаюсь разработкой приложения 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 в конструктор классов проверки?Если нет, каков правильный способ сделать это?
- Было бы лучше вернуть какой-нибудь список ошибок вместо исключения броска?
Спасибо