3

Lors de l'utilisation de la validation du bean pour valider l'état d'un objet, la méthode annotée @AssertTrue est appelée 4 fois à chaque fois que la validation est appelée. Il ne devrait être appelé qu'une fois par invocation.Lors de l'utilisation de @AssertTrue dans les méthodes, la méthode est invoquée 4 fois pendant la validation (Bean Validation)

Version Hibernate-validateur: 5.1.3.Final

Voici un exemple:

pour la moto de classe suivante:

import javax.validation.constraints.AssertTrue; 
class Motorcycle{ 
    private int fuel; 
    private int tireDurability; 

    @AssertTrue(message = "motorcycle.not.available.to.use") 
    public boolean isAvailable(){ 
     return fuel > 0 && tireDurability > 0; 
    } 

    public void toUse(){...} 
} 

Et le principal:

import javax.validation.Validation; 
import javax.validation.Validator; 
import javax.validation.ValidatorFactory; 
public class Main{ 
    public static void main(String []args){ 
     ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
     Validator validator = factory.getValidator(); 

     Set<ConstraintViolation<Motorcycle>> violations = validator.validate(new Motorcycle()); 

    } 
} 

Lorsque validator.validate(new Motorcycle()) est c Alled, la méthode isAvailable() est invoquée 4 fois.

Quelqu'un peut-il m'aider avec cette situation? Est-ce un bug? Comment est-ce que je travaille autour d'elle?

Répondre

2

Vous devriez essayer d'utiliser Hibernate Validator 6.0.2.Final (c'est actuellement la dernière version disponible). Prochain test ne passe avec cette (dernière) version de validateur:

@Test 
public void testMotorcycle() throws Exception { 
    AtomicInteger count = new AtomicInteger(0); 

    Motorcycle motorcycle = new Motorcycle(count); 
    validator.validate(motorcycle); 
    assertEquals(motorcycle.count.get(), 1); 
} 

class Motorcycle { 
    final AtomicInteger count; 
    private int fuel; 
    private int tireDurability; 

    Motorcycle(AtomicInteger count) { 
     this.count = count; 
    } 

    @AssertTrue(message = "motorcycle.not.available.to.use") 
    public boolean isAvailable() { 
     count.incrementAndGet(); 
     return fuel > 0 && tireDurability > 0; 
    } 

} 

J'ai essayé de l'exécuter avec 5.1 ainsi - et il passe également là. Comment avez-vous déterminé que la méthode est appelée 4 fois?