2016-04-02 4 views
1

Ich erstelle einen Feldebene Zwang nur wie in diesem Beispiel https://docs.jboss.org/hibernate/validator/4.2/reference/en-US/html/validator-usingvalidator.html#d0e281 und setze dann in meinem Bereich, der ein Objekt istHibernate Validate Objekt innerhalb ConstraintValidator mit Frühlings-Boot-

public classe Car { 

    @validateEngine 
private Engine engine; 
... 
} 

meine Motorklasse:

public class Engine { 
    @ValidadeEngineName 
    private String name; 
    @NotNull 
    private Integer size; 
} 

`s möglich in meinem validateEngineImpl

public class validateEngineImpl implements ConstraintValidator<validateEngine, String> { 



     @Override 
     public void initialize(validateEngine constraintAnnotation) { 
      System.out.println("s"); 
     } 

     @Override 
     public boolean isValid(Engine value, ConstraintValidatorContext context) { 
      if(value == null){ 
    return true; 
    }else{ 
     //HERE I NEED TO execute one validation in engine, 
but I want to use the annotations, something like 
Validator.valide(value), or I need to validate one by one? Strings.isNullOrEmpty(value.getName()).... 
     } 
    } 

t Verwenden er Code aus @Hervian, arbeitet aber in meinem validateEngineNameImpl verlor ich die @Autowired

public class validateEngineNameImpl implements ConstraintValidator<validateEngineName, String> { 

    @Autowired 
    private MyService myService; 

    @Override 
    public void initialize(validateEngine constraintAnnotation) { 
     System.out.println("s"); 
    } 

    @Override 
    public boolean isValid(Engine value, ConstraintValidatorContext context) { 
     //Here my myService are not autowired 
    } 

} 

Es s possible don t die @Autowired verloren, oder passieren somethig meiner validateEngineNameImpl von validateEngineImpl?

Antwort

1

In Ihrer Fahrzeugklasse einfach das Motorfeld mit @Valid annotieren.

Dann rufe:

ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
Validator validator = factory.getValidator(); 
Set<ConstraintViolation<Car>> set = validator.validate(car); 

wird "gehen in den" Engine-Instanz und validieren, die verschiedene kommentierten Felder gegen ihren ConstraintValidators.

Probieren Sie es aus - setzen Sie das Attribut size auf null fx. Sie sollten einen nicht leeren ConstraintViolations-Satz erhalten.

+0

Es hat fast funktioniert, in meiner Engine habe ich eine andere benutzerdefinierte Einschränkung, dass ich einige Autowired-Service mit Spring-Boot zu bekommen, also wenn ich mit diesem Code aufrufen, meine Dienst nicht autowired bin, aktualisiere ich meine Frage mit diesem anderen code .. tks –

+0

und andere Sache, wenn ich Run Set > set = validator.validate (Auto); Kehre nicht zu meiner Ansicht die Nachricht von der Autovalidierung zurück, nur die Nachricht von meiner ersten customcontraint –

Verwandte Themen