J'utilise la validation JPA 2.0 / Hibernate pour valider mes modèles. J'ai maintenant une situation où la combinaison de deux champs doit être validée:
public class MyModel {
public Integer getValue1() {
//...
}
public String getValue2() {
//...
}
}
Le modèle n'est pas valide si les deux getValue1()
et getValue2()
sont null
et valide dans le cas contraire.
Comment puis-je effectuer ce type de validation avec JPA 2.0 / Hibernate? Avec une simple @NotNull
annotation, les deux getters doivent être non nuls pour réussir la validation.
java
jpa
jpa-2.0
bean-validation
Daniel Rikowski
la source
la source
Réponses:
Pour la validation de plusieurs propriétés, vous devez utiliser des contraintes au niveau de la classe. Tiré de Bean Validation Sneak Peek, partie II: contraintes personnalisées :
la source
TYPE
etRUNTIME
doit être remplacé parElementType.TYPE
etRetentionPolicy.RUNTIME
, respectivement.import static java.lang.annotation.ElementType.*;
etimport static java.lang.annotation.RetentionPolicy.*;
Pour fonctionner correctement avec Bean Validation , l'exemple fourni dans la réponse de Pascal Thivent pourrait être réécrit comme suit:
@ValidAddress public class Address { @NotNull @Size(max = 50) private String street1; @Size(max = 50) private String street2; @NotNull @Size(max = 10) private String zipCode; @NotNull @Size(max = 20) private String city; @Valid @NotNull private Country country; // Getters and setters }
public class Country { @NotNull @Size(min = 2, max = 2) private String iso2; // Getters and setters }
@Documented @Target(TYPE) @Retention(RUNTIME) @Constraint(validatedBy = { MultiCountryAddressValidator.class }) public @interface ValidAddress { String message() default "{com.example.validation.ValidAddress.message}"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
public class MultiCountryAddressValidator implements ConstraintValidator<ValidAddress, Address> { public void initialize(ValidAddress constraintAnnotation) { } @Override public boolean isValid(Address address, ConstraintValidatorContext constraintValidatorContext) { Country country = address.getCountry(); if (country == null || country.getIso2() == null || address.getZipCode() == null) { return true; } switch (country.getIso2()) { case "FR": return // Check if address.getZipCode() is valid for France case "GR": return // Check if address.getZipCode() is valid for Greece default: return true; } } }
la source
isoA2Code
est stocké dans laCountry
table DB . Est-ce une bonne idée de faire un appel DB à partir d'ici? Aussi, je voudrais les lier après validation carAddress
belongs_to
aCountry
et je veux que l'address
entrée aitcountry
la clé étrangère de la table. Comment lier le pays à l'adresse?@ValidAddress
annotation sur l'objet Country, vous obtiendrez uneNo validator could be found for constraint 'com.example.validation.ValidAddress' validating type 'com.example.Country'
exception.Un validateur de niveau de classe personnalisé est la voie à suivre, lorsque vous souhaitez rester avec la spécification Bean Validation, exemple ici .
Si vous êtes satisfait d'utiliser une fonctionnalité Hibernate Validator, vous pouvez utiliser @ScriptAssert , qui est fourni depuis Validator-4.1.0.Final. Exceprt de son JavaDoc:
Exemple:
@ScriptAssert(lang = "javascript", script = "_this.value1 != null || _this != value2)") public class MyBean { private String value1; private String value2; }
la source