Spring MVC Cross-field Validation: Code Smell?

S’agit-il d’une odeur de code ou est-ce le meilleur moyen d’implémenter la validation inter-champs dans un formulaire Spring?

@FieldRequiredIf.List({ @FieldRequiredIf(ifField="firstHomePhoneNumber", matches={EMPTY, NULL},require ="firstMobilePhoneNumber",elseDisplay = "FieldRequiredIf.correspondenceDetailsForm.firstMobilePhoneNumber",groups=FirstLife.class), @FieldRequiredIf(ifField="secondHomePhoneNumber", matches={EMPTY,NULL},require ="secondMobilePhoneNumber",elseDisplay = "FieldRequiredIf.correspondenceDetailsForm.secondMobilePhoneNumber",groups=SecondLife.class), @FieldRequiredIf(ifField="lifeAssuredIsPolicyOwner", matches={FALSE},require ="policyOwnerName",elseDisplay = "FieldRequiredIf.correspondenceDetailsForm.policyOwnerName"), @FieldRequiredIf(ifField="lifeAssuredIsPolicyOwner", matches={FALSE},require ="policyOwnerAddress",elseDisplay = "FieldRequiredIf.correspondenceDetailsForm.policyOwnerAddress"), @FieldRequiredIf(ifField="insurableInterest", matches={InsurableInterestConstants.OTHER},require ="insurableInterestReason",elseDisplay = "FieldRequiredIf.correspondenceDetailsForm.insurableInterestReason",groups = NonSingleNonMortgage.class), @FieldRequiredIf(ifField="firstAddress2", matches={NOT_EMPTY},require ="firstAddress1",elseDisplay = "FieldRequiredIf.correspondenceDetailsForm.firstAddress1",groups=FirstLife.class), @FieldRequiredIf(ifField="firstAddress3", matches={NOT_EMPTY},require ="firstAddress2",elseDisplay = "FieldRequiredIf.correspondenceDetailsForm.firstAddress2",groups=FirstLife.class), @FieldRequiredIf(ifField="firstAddress4", matches={NOT_EMPTY},require ="firstAddress3",elseDisplay = "FieldRequiredIf.correspondenceDetailsForm.firstAddress3",groups=FirstLife.class), @FieldRequiredIf(ifField="firstAddress5", matches={NOT_EMPTY},require ="firstAddress4",elseDisplay = "FieldRequiredIf.correspondenceDetailsForm.firstAddress4",groups=FirstLife.class), @FieldRequiredIf(ifField="secondAddress2", matches={NOT_EMPTY},require ="secondAddress1",elseDisplay = "FieldRequiredIf.correspondenceDetailsForm.secondAddress1",groups=SecondLife.class), @FieldRequiredIf(ifField="secondAddress3", matches={NOT_EMPTY},require ="secondAddress2",elseDisplay = "FieldRequiredIf.correspondenceDetailsForm.secondAddress2",groups=SecondLife.class), @FieldRequiredIf(ifField="secondAddress4", matches={NOT_EMPTY},require ="secondAddress3",elseDisplay = "FieldRequiredIf.correspondenceDetailsForm.secondAddress3",groups=SecondLife.class), @FieldRequiredIf(ifField="secondAddress5", matches={NOT_EMPTY},require ="secondAddress4",elseDisplay = "FieldRequiredIf.correspondenceDetailsForm.secondAddress4",groups=SecondLife.class) }) public class CorrespondenceDetailsForm { ... } 

Refactoring

Pour tenter de simplifier ce qui précède, j’ai commencé à refactoriser quelques groupes logiques de ces annotations répertoriées en une seule annotation personnalisée: (@FirstLifeContactDetailsObserver et @SecondLifeContactDetailsObserver). Voici les annotations de niveau de classe refactorisées:

 @FieldRequiredIf.List({ @FieldRequiredIf(ifField="lifeAssuredIsPolicyOwner", matches={FALSE},require ="policyOwnerName",elseDisplay = "FieldRequiredIf.correspondenceDetailsForm.policyOwnerName"), @FieldRequiredIf(ifField="lifeAssuredIsPolicyOwner", matches={FALSE},require ="policyOwnerAddress",elseDisplay = "FieldRequiredIf.correspondenceDetailsForm.policyOwnerAddress"), @FieldRequiredIf(ifField="insurableInterest", matches={InsurableInterestConstants.OTHER},require ="insurableInterestReason",elseDisplay = "FieldRequiredIf.correspondenceDetailsForm.insurableInterestReason",groups = NonSingleNonMortgage.class) }) @FirstLifeContactDetailsObserver @SecondLifeContactDetailsObserver public class CorrespondenceDetailsForm { ... } 

Cela n’a cependant pas vraiment amélioré la situation, car j’ai besoin d’une classe de validation pour chaque nouvelle annotation.

Existe-t-il une meilleure façon de procéder à la validation inter-champs dans Spring MVC?

Juste pour terminer cette question et la lier dans un joli petit arc, deux commentateurs de l’errata ont mentionné que la vue avant de ce scénario est en fait le moyen recommandé pour implémenter des validations entre champs .

Bien que ce soit certainement une odeur de conception émanant de la direction au vent de Spring MVC, ce n’est pas un problème avec votre code.

C’est ce que vous feriez au spring. Vous voudrez peut-être jeter un coup d’œil sur l’évolution de JSF et réévaluer si Spring est toujours votre choix numéro un. Les coutures peuvent aider à une validation plus nette sur le terrain.