2017-05-16 2 views
5

ich das folgende Feld mit @Value kommentiert haben, einen Standardwert festgelegt wird:Frühling @Value Anmerkung min max int erzwingen

@Value("${tolerance.percentage:25}") 
private int tolerance; 

Dieser Code richtig initialisiert wird, den Wert des Feldes an die Systemeigenschaft „tolerance.percentage“ wenn diese Stütze existiert. Wenn es nicht existiert, ist es standardmäßig 25.

Ich möchte jedoch einen Schritt weiter gehen, indem ich ein Minimum und Maximum für dieses int-Feld erzwinge, da es einen Prozentsatz von weniger als 100 als ganze Zahl darstellt, und Murphys Gesetz bedeutet, dass jemand (wahrscheinlich ich) die Eigenschaft extern falsch konfigurieren kann und meine App zur Laufzeit merkwürdige Dinge tun würde, was für meinen Geschmack viel zu spät ist. Ich möchte, dass ein Fehler ausgelöst wird, wenn die Eigenschaft beim Start der Anwendung auf "101" oder "-1" gesetzt wird. Verdammt, ich möchte sogar, dass ein Fehler ausgelöst wird, wenn ich versuche, ihn in der @Value Annotation auf 101 zu setzen, aber das ist für die Zwecke dieser Frage nicht wichtig. Hier ist, was ich versucht:

//@Min and @Max don't produce the intended behavior when combined with @Value 
@Min(0) 
@Max(100) 
@Value("${tolerance.percentage:25}") 
private int tolerance; 

Kann ich eine min und max auf einem int Feld erzwingen, dass @Value ist sich dessen bewusst?

+0

'@ Value' den Wert beim Start-up-Zeit injiziert (für Singletons, nicht sicher, ob Sie die Bohne haben wie. 'prototype'); Ich glaube nicht, dass die Bean-Validierung zu diesem Zeitpunkt (automatisch) ausgelöst wird ... –

+3

Die Validierung wird nur in' @ConfigurationProperties'-Klassen, nicht in regulären Klassen, durchgeführt. Wenn Sie diese Werte validieren wollen Fügen Sie eine '@ PostConstruct' Methode hinzu, um den Bereich zu überprüfen oder injizieren Sie sie in den Konstruktor und führen Sie dort die Validierung durch. –

+0

@M.Deinum Das Hinzufügen von '@ ConfigurationProperties' zu meinem Pojo funktionierte. Nach dem Hinzufügen begannen die Annotationen als Ich dachte, sie würden das. Wenn Sie Ihren Kommentar formalisieren in eine Antwort werde ich es akzeptieren. – JellyRaptor

Antwort

4

Die Validierung mit regulären API-Annotationen für die Validierung funktioniert nur unter bestimmten Umständen.

  1. Sie haben eine Implementierung (‚Hibernate-Validator‘) auf dem Classpath
  2. Die Klasse sie sind externalized configuration

Statt @Value mit denen verwenden Sie wahrscheinlich wollen zu binden, in verwendet Erstellen Sie eine Klasse, die die erwarteten Eigenschaften enthält, und verwenden Sie Bindung mit @ConfigurationProperties. (und Sie könnten stattdessen @Range verwenden).

@ConfigurationProperties(prefix="tolerance") 
public ToleranceProperties { 

    @Range(min=1, max=100) 
    private int percentage = 25; 

    // Here be a getter/setter 
} 

Dieses auf einer Klasse hinzufügen @ EnableConfigurationProperties(ToleranceProperties.class)@Configuration kombiniert und Sie können es Sie Eigenschaften benötigen überall verwenden. (Siehe typesafe configuration properties im Referenz-Handbuch

. Hinweis: Sie können auch erklären ihn als @Component

+0

Ich werde nur hinzufügen, dass Setter ist zwingend erforderlich, damit dies funktioniert, während Getter ist nicht – Zotov

+0

Haben Sie dies ohne eine "Getter" macht keinen Sinn, als wie würden Sie den Wert bekommen? (es sei denn, es ist Teil einer anderen kombinierten Eigenschaft). –

+0

Sie könnten möglicherweise '@ Component' mit' @ ConfigurationProperties' annotieren, und diese Komponente würde dann diese Eigenschaften intern verwenden. – Zotov