Mein Beispielprojekt ist Maven-basierte Struktur, alle meine Anwendungsprojekten Dateien unter src/main/resources
Ordner. Unten ist der vollständige Beispielcode. Ich verstehe nicht, warum mein Code nicht in der Lage ist, Profile richtig zu finden, wenn ich @PropertySource
Annotation nicht verwende.Spring Profiles org.springframework.beans.factory.NoSuchBeanDefinitionException
Meine eigentliche Zweifel ist: Ich habe Spring-Eigenschaften ziemlich gut in application.properties Datei konfiguriert, aber warum kann es nicht finden, Profil und ihre jeweiligen Eigenschaft Dateien? Es sei denn, ich verwende @PropertySource
Annotation, IAM nicht Wert für env.getProperty ("mysql.url") erhalten. Ich meine Environment
Klasse nicht in der Lage, Werte von Profilen Eigenschaft Dateien abholen. WARUM?
Iam immer Fehler wie folgt:
Jul 08, 2017 7:54:26 PM org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
INFO: Refreshing org.spring[email protected]300ffa5d: startup date [Sat Jul 08 19:54:26 IST 2017]; root of context hierarchy
helloBean
Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'datasource' available
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:687)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1207)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:284)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1084)
at com.oreilly.datasource.Main2.main(Main2.java:15)
DatasourceConfig.java
package com.oreilly.datasource;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.annotation.PropertySources;
import org.springframework.core.env.Environment;
@Configuration
/*@PropertySource("classpath:/application.properties")
@PropertySource("classpath:/dev/application-dev.properties")
@PropertySource("classpath:/prod/application-prod.properties")*/
public class DatasourceConfig {
@Autowired
private Environment env;
@Bean(name="helloBean")
public String helloWorld() {
System.out.println("helloBean");
return "helloWorld....";
}
@Bean(name="datasource")
@Profile("dev")
public DataSource datasourceForDev(){
BasicDataSource dataSource = new BasicDataSource();
System.out.println(env.getProperty("mysql.url"));
return dataSource;
}
@Bean(name="datasource")
@Profile("prod")
public DataSource datasourceForProd(){
BasicDataSource dataSource = new BasicDataSource();
System.out.println(env.getProperty("mysql.url"));
return dataSource;
}
}
Main2.java
package com.oreilly.datasource;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main2 {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DatasourceConfig.class);
DataSource dataSource = context.getBean("datasource", DataSource.class);
String helloBean = context.getBean("helloBean", String.class);
}
}
application.properties
spring.profiles.active=prod
spring.config.name=application
spring.config.location=classpath:/application.properties,classpath:/dev/application-dev.properties,classpath:/prod/application-dev.properties
Unten ist die Ordnerstruktur Projekt:
Bitte sagen Sie mir, was falsch gelaufen?
Ich möchte Eigenschaftendatei automatisch basierend auf Profil, das ich in application.properties deklariert. – John
Ohne Verwendung von @PropertySource sollte funktionieren, wie? Ich meine es sollte meine application-dev.properties automatisch abholen, wie? – John