2017-08-17 3 views
0

Je suis en train de refactorisation ce coderefactorisation validation de la logique métier

private void validate(Customer customer) { 

    List<String> errors = new ArrayList<>(); 

    if (customer == null) { 
     errors.add("Customer must not be null"); 
    } 

    if (customer != null && customer.getName() == null) { 
     errors.add("Name must not be null"); 
    } 

    if (customer != null && customer.getName().isEmpty()) { 
     errors.add("Name must not be empty"); 
    } 

    if (customer != null) { 
     Customer customerFromDb = customerRepository.findByName(customer.getName()); 
     if (customerFromDb != null) { 
      errors.add("Customer already present on db"); 
     } 
    } 

    if (!errors.isEmpty()) { 
     throw new ValidationException(errors); 
    } 
} 

J'ai lu ce post Business logic validation patterns & advices

Je voudrais construire un validateur générique pour mes entités et domaines de l'entité, je a écrit ce

private void validate(Customer customer) { 

    List<ValidationRule> validationRules = new ArrayList<>(); 

    validationRules.add(new NotNullValidationRule(customer)); 
    validationRules.add(new NotNullValidationRule(customer, Customer::getName)); 
    validationRules.add(new NotEmptyValidationRule(customer, Customer::getName)); 
    validationRules.add(new AlreadyExistValidationRule(customer -> customerRepository.findByName(customer.getName()))); 

    Validator.validate(validationRules); 
} 

et la classe Validator

public class Validator { 

    public static void validate(List<ValidationRule> validationRules) { 
     final List<String> errors = new ArrayList<>(); 
     for (final ValidationRule rule : validationRules) { 
      final Optional<String> error = rule.validate(); 
      if (error.isPresent()) { 
       errors.add(error.get()); 
      } 
     } 

     if (!errors.isEmpty()) { 
      throw new ValidationException(errors); 
     } 
    } 
} 

mais je ne sais pas comment mettre en œuvre la ValidationRule d'interface et d'autres classes (NotNullValidationRule, NotEmptyValidationRule, AlreadyExistValidationRule)

+0

Avez-vous trouvé la réponse? –

Répondre

0

Je voudrais écrire quelque chose comme:

CommonValidations.notNull(errors, customer); 
if (customer != null) { 
    CommonValidations.notEmpty(errors, customer.getName()); 
} 
customerCustomeBeanValidations.validName(errors, customer.getName()); 
customerCustomeBeanValidations.notExist(errors, customer.getName()); 
0

Dans le lien que vous faites référence, la réponse acceptée suggéré en utilisant le modèle de conception Strategy, et a ensuite donné un exemple d'une interface et de la mise en œuvre. Dans votre cas, vous allez créer une nouvelle interface ValidationRule, avec au moins une méthode validate(), puis vous créerez des classes concrètes implémentant chacune une interface (NotNullValidationRule, NotEmptyValidationRule, AlreadyExistValidationRule).