2015-11-21 5 views
6

Wenn Sie die Annotation @ConfigurationProperties verwenden, um Eigenschaften in eine Bean zu injizieren, bietet Spring die Möglichkeit, einen benutzerdefinierten Validator zum Überprüfen dieser Eigenschaften zu definieren.Mehrere @ConfigurationProperties-Validierungsbeans in Spring-Umgebung

Die ConfigurationPropertiesBindingPostProcessor sucht diesen Validierer mit dem Namen der festen Bean "configurationPropertiesValidator" und Klasse org.springframework.validation.Validator.

Nun nehme ich an, ich habe eine @ConfigurationProperties mit seinem Prüfer in einem Modul A. Ein anderes Modul B hat eine Abhängigkeit von Modul A. Modul B definiert auch seine eigenen @ConfigurationProperties und einen eigenen Prüfer.

Wenn die App geladen wird, nimmt der Postprozessor nur eine dieser Beans auf. Dies deaktiviert den anderen Teil der Validierung.

Gibt es eine Lösung für dieses? Wie kann ich beide Validatoren für Konfigurationseigenschaften in meiner Anwendung aktiviert lassen?

Antwort

6

Ich habe gerade das gleiche Problem festgestellt und festgestellt, dass ConfigurationPropertiesBindingPostProcessor überprüft, ob die Klasse mit @ConfigurationProperties die Validator-Schnittstelle selbst annotiert. (Siehe org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor#determineValidator)

So ist die Lösung ist, alle Eigenschaft Validierung der kommentierten Festigkeitsklasse zu verschieben:

import org.springframework.boot.context.properties.ConfigurationProperties; 
import org.springframework.stereotype.Component; 
import org.springframework.validation.Errors; 
import org.springframework.validation.ValidationUtils; 
import org.springframework.validation.Validator; 

@ConfigurationProperties("test.properties") 
@Component 
public class TestProperties implements Validator { 

    private String myProp; 

    public String getMyProp() 
    { 
     return myProp; 
    } 

    public void setMyProp(String myProp) 
    { 
     this.myProp = myProp; 
    } 

    public boolean supports(Class<?> clazz) 
    { 
     return clazz == TestProperties.class; 
    } 

    public void validate(Object target, Errors errors) 
    { 
     ValidationUtils.rejectIfEmpty(errors, "myProp", "myProp.empty"); 

     TestProperties properties = (TestProperties) target; 

     if (!"validThing".equals(properties.getMyProp())) { 
      errors.rejectValue("myProp", "Not a valid thing"); 
     } 
    } 
} 
+0

ich gerade erkannte auch, dass das, indem Sie die Standard 'configurationPropertiesValidator' kehrt zurück zu' Jsr303ValidatorFactory' die bedeutet, dass Sie Eigenschaften mit Ihrer benutzerdefinierten Validator-Implementierung und JSR-303-Anmerkungen überprüfen können: –

+0

Ich kann das nicht für mich arbeiten. Es scheint nur meinen Kunden Validator zu ignorieren – Plog