gpt4 book ai didi

spring - 当我尝试 Autowiring 时环境为空

转载 作者:行者123 更新时间:2023-12-04 01:56:35 26 4
gpt4 key购买 nike

我正在尝试使用 Spring 的环境抽象和 @PropertySource 来加载和使用我的 @Configuration 注释类中的属性。但是,我在我的 PropertyConfig 类中将 Environment 设置为 null,因为它是从另一个 @Configuration 类 PersistenceConfig 访问的,该类使用它来访问属性。这是我的相关代码:

   @Configuration
@PropertySource({ "classpath:/properties/email_${environment}.properties" })
@PropertySource({ "classpath:/properties/appconfig.properties" })
@PropertySource({ "classpath:/properties/ApplicationResources.properties" })
@PropertySource({ "classpath:/properties/Database_${environment}.properties" })
@PropertySource({ "classpath:/properties/log4j.properties" })
@PropertySource({ "classpath:/properties/system.properties" })
public class PropertiesConfig {

@Autowired
private Environment env;

private static final PropertiesAccessor propertyAccessor = new PropertiesConfig().new PropertiesAccessor();

public static String getPopertyValue(String property){
return propertyAccessor.getPropertyValue(property);
}

private class PropertiesAccessor{

public String getPropertyValue(String key){
return env.getProperty(key);
}
}
}

我的另一个@Configuration注解类PersistenceConfig如下:

  @Configuration
@EnableTransactionManagement
@ComponentScan(basePackages = {"com.template"})
public class PersistenceConfig {

@Bean
public LocalSessionFactoryBean sessionFactory(){

LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
sessionFactory.setPackagesToScan(new String [] {"com.template.domain" });
sessionFactory.setHibernateProperties(hibernateProperties());
return sessionFactory;


}

@Bean
public BasicDataSource dataSource(){

BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(PropertiesConfig.getPopertyValue("jdbc.driverClassName"));
dataSource.setUrl(PropertiesConfig.getPopertyValue("jdbc.url"));
dataSource.setUsername(PropertiesConfig.getPopertyValue("jdbc.user"));
dataSource.setPassword(PropertiesConfig.getPopertyValue("jdbc.pass"));

return dataSource;
}


@Bean
public HibernateTransactionManager transactionManager(){
HibernateTransactionManager transactionManager = new HibernateTransactionManager();
transactionManager.setSessionFactory(sessionFactory().getObject());
return transactionManager;
}

Properties hibernateProperties(){
return new Properties() {
{
setProperty("hibernate.hbm2ddl.auto", PropertiesConfig.getPopertyValue("hibernate.hbm2ddl.auto"));
setProperty("hibernate.dialect", PropertiesConfig.getPopertyValue("hibernate.dialect"));
setProperty("hibernate.globally_quoted_identifiers", "true");
}
};

}

}

但是,当 PersistenceConfig 的 dataSource() 方法尝试使用 PropertiesConfig.getPopertyValue("jdbc.driverClassName") 检索属性时,我得到 NullpointerException,因为类型 Environment 的 env 在 PropertyConfig 中为 null。

我在我的 WebApplicationInitializer 中按如下方式加载这两个类:

 public class WebAppInitializer implements WebApplicationInitializer {

@Override
public void onStartup(ServletContext container) {
// Create the 'root' Spring application context
AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
rootContext.register(PropertiesConfig.class,SecurityConfig.class,PersistenceConfig.class,ApplicationConfig.class);
//rootContext.register(ApplicationConfig.class, PersistenceConfig.class, SecurityConfig.class); I have not added security yet

// Manage the life-cycle of the root application context
container.addListener(new ContextLoaderListener(rootContext));

// Create the dispatcher servlet's Spring application context
AnnotationConfigWebApplicationContext dispatcherServlet = new AnnotationConfigWebApplicationContext();
dispatcherServlet.register(MvcConfig.class);

// Register and map the dispatcher servlet
ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(dispatcherServlet));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");

}

据我了解,PersistenceConfig 在 PropertyConfig 之前首先被加载。我对吗?还是有其他原因?如何实现?

最佳答案

package com.template.config;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;import
org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;

@Configuration
@PropertySource({ "classpath:/properties/email_${environment}.properties" })
@PropertySource({ "classpath:/properties/appconfig.properties" })
@PropertySource({ "classpath:/properties/ApplicationResources.properties" })
@PropertySource({ "classpath:/properties/Database_${environment}.properties"

})
@PropertySource({ "classpath:/properties/log4j.properties" })
@PropertySource({ "classpath:/properties/system.properties" })
public class PropertiesConfig {

@Autowired
private Environment env;

private static Environment environment;

@PostConstruct
public void init(){
environment = env;
System.out.println(environment == env);
}

public static String getPopertyValue(String property){
return environment.getProperty(property);
}
}

关于spring - 当我尝试 Autowiring 时环境为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35394289/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com