2017-01-20 1 views
0

Ich habe einen Frühling Boot-Projekt, bei der Projektstruktur aussieht wie untenWarum kann @Value in diesem Abhängigkeitsmodul nicht aufgelöst werden?

example(artifactId = example) 
+- demo(artifactId = demo) 
| +- src 
| | +-main 
| |  +-java 
| |  +-com 
| |   +-example 
| |    +-DemoService 
| |  +-resources 
| |   +-application.properties 
| +- pom.xml 
+- demo2(artifactId = demo2) 
| +- src 
| | +-main 
| |  +-java 
| |  +-resources 
| |   +-application.properties 
| +- pom.xml 
+-pom.xml 

In diesem Projekt „demo2“ ist die Abhängigkeit der „Demo“. Das "Beispiel" -Modul ist das Elternteil von sowohl demo als auch demo2. Das

Das Problem ist, dass, wenn ich die Eigenschaft (site.password = Passwort) in application.properties der Demo, ich mag es diese

im Demo-Modul nicht lösen kann
@Service 
public class DemoService { 

    @Value("${site.password}") 
    private String password; 
} 

Aber wenn ich gesetzt es zu den application.properties in demo2, kann es im DemoService im Demomodul gelöst werden.

Vielen Dank im Voraus!

Zur Verdeutlichung: Demo2 ist die Hauptklasse.

Antwort

0

Sie haben die gleiche Classpath verwenden Datei (classpath:application.properties) auf beiden Gläsern wird nur eins sichtbar sein. Normalerweise sollte die Konfiguration nicht in einem Jar enthalten sein. Es sollte in dem Paket mit main Methode (demo2 in Ihrem Fall) angegeben werden.

Sie auch einige Standardwerte für @Value Anmerkungen wie angeben: @Value("${site.password:mypassword}")Details

Wenn Sie immer noch in einem Glas einschließen mögen Eigenschaften, versuchen Sie es in einem einzigartigen Verzeichnis setzen wie: src/main/resources/com/example/demo.properties und es in demo2 über spring.config.location .

+0

Danke bekce. Ich stimme zu, dass die Konfiguration nicht in einem Glas verpackt werden sollte. In meinem Projekt habe ich ein Modul ("demo"), das die Dinge mit mysql und redis behandelt, und andere Module ("demo2", "demo3" ...) bekommen einfach Daten davon. Ich habe Eigenschaften in "demo" eingestellt, weil ich die mysql/redisis Eigenschaften nicht auf alle anderen Module kopieren möchte. Gibt es eine bessere Möglichkeit, das Projekt zu organisieren? Trennen Sie die Projekte beispielsweise von mehreren kleinen Projekten. Jedes Modul ist ein Projekt. "demo2" und andere erhalten Daten von "demo" via RPC. – Max

+0

@Max Sie scheinen über die Modulverwaltung verwirrt zu sein.Es gibt zwei allgemeine Optionen für Ihren Fall: 1. Jedes Modul läuft von selbst und bietet Dienste über REST API, RPC oder MQ. Es gibt viele "Haupt" -Methoden, jedes Modul hat seine eigene Konfiguration. Dies wird auch als Microservice-Architektur bezeichnet. 2. Es gibt ein "Haupt" -Modul und es ruft Methoden abhängiger Module auf (dies ist kein RPC) sollte eine Konfiguration sein.Ihr Fall passt 2.Normalerweise bedeutet N laufende Instanzen N-Konfiguration, also setzen Sie alle conf in ein Modul.Wenn 'demo3' die' demo' Methode aufruft, einfach '@ Autowire' relevante Beans. – bekce

0

Anwendungseigenschaften in Ihrem Glas verpackt Vorrang hat, können weitere Details dort eingestellt finden https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

Sie können aber auch, welche Eigenschaften wie diese Ressource

--spring.config.location=classpath:/mydefault.properties 
+0

Danke. Demo2 und Demo haben ihre eigenen Eigenschaftendateien. Ich möchte sie dazu bringen, ihre eigenen Eigenschaften zu laden. Wird der Befehl "--spring.config.location = classpath: /mydefault.properties" die gleichen laden? – Max

+0

Sie können Eigenschaftendateien wie folgt angeben --spring.config.location = Klassenpfad: /default.properties,classpath: /override.properties – ravthiru

Verwandte Themen