Java 在Spring中更新属性文件中的数据库设置
我是春天的新手 我正在尝试创建一个数据库管理器页面,该页面在页面加载时显示数据库详细信息,并在用户按提交时更新数据库设置 我随后在属性文件中设置了数据库设置 我设法以编程方式更新属性文件中的数据库设置。当我使用以下代码检索数据库设置时Java 在Spring中更新属性文件中的数据库设置,java,spring,jsf,Java,Spring,Jsf,我是春天的新手 我正在尝试创建一个数据库管理器页面,该页面在页面加载时显示数据库详细信息,并在用户按提交时更新数据库设置 我随后在属性文件中设置了数据库设置 我设法以编程方式更新属性文件中的数据库设置。当我使用以下代码检索数据库设置时 DriverManagerDataSource databaseSource = (DriverManagerDataSource)context.getBean("dataSource"); databaseSource.getUsername(); 我成功地
DriverManagerDataSource databaseSource = (DriverManagerDataSource)context.getBean("dataSource");
databaseSource.getUsername();
我成功地获得了旧值,但无法获得新值
这是applicationContext.xml文件中的映射
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:/bundle/database.properties</value>
</property>
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" scope="prototype">
<property name="location">
<value>classpath:/bundle/database.properties</value>
</property>
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- Hibernate SessionFactory Definition -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.cglib.use_reflection_optimizer">
true
</prop>
<prop key="hibernate.cache.provider_class">
org.hibernate.cache.HashtableCacheProvider
</prop>
<prop key="hibernate.connection.useUnicode">true</prop>
<prop key="hibernate.connection.characterEncoding">UTF-8</prop>
</props>
</property>
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
<!-- Spring Data Access Exception Translator Definition -->
<bean id="jdbcExceptionTranslator"
class="org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator">
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
<!-- Hibernate Template Definition -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
<property name="jdbcExceptionTranslator">
<ref bean="jdbcExceptionTranslator" />
</property>
</bean>
<!--
========================= Start of SERVICE DEFINITIONS
=========================
-->
<!-- Hibernate Transaction Manager Definition -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<!-- AddressBook Service Definition -->
<bean id="loginServiceTarget" class="com.smartcall.service.impl.LoginServiceImpl">
<property name="loginDAO">
<ref local="loginDAO" />
</property>
</bean>
<!-- Login DAO Definition: Hibernate implementation -->
<bean id="loginDAO"
class="com.smartcall.dao.hibernate.HibernateLoginDAO">
<property name="hibernateTemplate">
<ref bean="hibernateTemplate" />
</property>
</bean>
<!-- Transactional proxy for the AddressBook Service -->
<bean id="loginService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager" />
</property>
<property name="target">
<ref local="loginServiceTarget" />
</property>
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
如果我将其更改为AbstractApplicationContext,那么在上述代码中需要做什么更改
更新
this.context = (AbstractApplicationContext)WebApplicationContextUtils
.getRequiredWebApplicationContext(servletContext);
String valueForTheProperty = "";
context.refresh();
当我添加上面的行时,我得到
org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is java.lang.NullPointerException
org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:599)
org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:377)
org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:263)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:101)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
$Proxy1.getDatabasePasswordFromSettings(Unknown Source)
com.smartcall.delegate.DbSettingsDelegate.getDatabasePassswordFromSettings(DbSettingsDelegate.java:38)
com.smartcall.bean.DbSettingsBean.loadDatabaseSettings(DbSettingsBean.java:49)
com.smartcall.bean.DbSettingsBean.<init>(DbSettingsBean.java:41)
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
java.lang.reflect.Constructor.newInstance(Constructor.java:513)
java.lang.Class.newInstance0(Class.java:355)
java.lang.Class.newInstance(Class.java:308)
com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:185)
com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:105)
com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:368)
com.sun.faces.mgbean.BeanManager.create(BeanManager.java:230)
com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:86)
javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)
com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72)
org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:68)
org.apache.el.parser.AstValue.getValue(AstValue.java:112)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:71)
com.sun.faces.application.ApplicationImpl.createComponent(ApplicationImpl.java:246)
com.sun.facelets.tag.jsf.ComponentHandler.createComponent(ComponentHandler.java:224)
com.sun.facelets.tag.jsf.ComponentHandler.apply(ComponentHandler.java:139)
com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
com.sun.facelets.tag.jsf.ComponentHandler.applyNextHandler(ComponentHandler.java:314)
com.sun.facelets.tag.jsf.ComponentHandler.apply(ComponentHandler.java:169)
com.sun.facelets.tag.jsf.core.ViewHandler.apply(ViewHandler.java:109)
com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
com.sun.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:49)
com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
com.sun.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:25)
com.sun.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:95)
com.sun.facelets.FaceletViewHandler.buildView(FaceletViewHandler.java:524)
com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:567)
org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:100)
org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:176)
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:110)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:266)
org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
root cause
java.lang.NullPointerException
org.hibernate.cache.impl.bridge.RegionFactoryCacheProviderBridge.nextTimestamp(RegionFactoryCacheProviderBridge.java:85)
org.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:526)
org.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:535)
org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:493)
org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:377)
org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:263)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:101)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
$Proxy1.getDatabasePasswordFromSettings(Unknown Source)
com.smartcall.delegate.DbSettingsDelegate.getDatabasePassswordFromSettings(DbSettingsDelegate.java:38)
com.smartcall.bean.DbSettingsBean.loadDatabaseSettings(DbSettingsBean.java:49)
com.smartcall.bean.DbSettingsBean.<init>(DbSettingsBean.java:41)
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
java.lang.reflect.Constructor.newInstance(Constructor.java:513)
java.lang.Class.newInstance0(Class.java:355)
java.lang.Class.newInstance(Class.java:308)
com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:185)
com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:105)
com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:368)
com.sun.faces.mgbean.BeanManager.create(BeanManager.java:230)
com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:86)
javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)
com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72)
org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:68)
org.apache.el.parser.AstValue.getValue(AstValue.java:112)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:71)
com.sun.faces.application.ApplicationImpl.createComponent(ApplicationImpl.java:246)
com.sun.facelets.tag.jsf.ComponentHandler.createComponent(ComponentHandler.java:224)
com.sun.facelets.tag.jsf.ComponentHandler.apply(ComponentHandler.java:139)
com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
com.sun.facelets.tag.jsf.ComponentHandler.applyNextHandler(ComponentHandler.java:314)
com.sun.facelets.tag.jsf.ComponentHandler.apply(ComponentHandler.java:169)
com.sun.facelets.tag.jsf.core.ViewHandler.apply(ViewHandler.java:109)
com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
com.sun.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:49)
com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
com.sun.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:25)
com.sun.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:95)
com.sun.facelets.FaceletViewHandler.buildView(FaceletViewHandler.java:524)
com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:567)
org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:100)
org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:176)
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:110)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:266)
org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
应用程序运行良好。Plz帮助
更新
this.context = (AbstractApplicationContext)WebApplicationContextUtils
.getRequiredWebApplicationContext(servletContext);
String valueForTheProperty = "";
context.refresh();
丁豆
public DbSettingsBean()
{
dbSettingsDelegate = new DbSettingsDelegate();
loadDatabaseSettings();
submitButton.setRendered(false);
testButton.setRendered(true);
}
public void loadDatabaseSettings()
{
this.setUserName(dbSettingsDelegate.getDatabaseUserNameFromSettings());
this.setPassword(dbSettingsDelegate.getDatabasePassswordFromSettings());
this.setServerName(dbSettingsDelegate.getDatabaseServerNameFromSettings());
this.setDataSourceName(dbSettingsDelegate.getDatabaseNameFromSettings());
}
public HtmlOutputText getText()
{
return text;
}
public void setText(HtmlOutputText text)
{
this.text = text;
}
public HtmlAjaxCommandButton getSubmitButton()
{
return submitButton;
}
public void setSubmitButton(HtmlAjaxCommandButton submitButton)
{
this.submitButton = submitButton;
}
public HtmlCommandButton getTestButton()
{
return testButton;
}
public void setTestButton(HtmlCommandButton testButton)
{
this.testButton = testButton;
}
public HtmlOutputText getStatusMessageComponent()
{
return statusMessageComponent;
}
public void setStatusMessageComponent(HtmlOutputText statusMessageComponent)
{
this.statusMessageComponent = statusMessageComponent;
}
public UIInput getPassworder()
{
return passworder;
}
public void setPassworder(UIInput passworder)
{
this.passworder = passworder;
}
public String getServerName()
{
return serverName;
}
public void setServerName(String serverName)
{
this.serverName = serverName;
}
public String getDataSourceName()
{
return dataSourceName;
}
public void setDataSourceName(String dataSourceName)
{
this.dataSourceName = dataSourceName;
}
public String getUserName()
{
return userName;
}
public void setUserName(String userName)
{
this.userName = userName;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
public String testWhetherTheConnectionExists()
{
return dbSettingsDelegate.checkWhetherDatabaseConnectionExists(getUserName(), getPassword(), getDataSourceName(),getServerName());
}
和
DbSettingsDelegate
public DbSettingsDelegate()
{
try
{
System.out.println("Dbsettings delegate: "+FacesContext.getCurrentInstance());
dbSettingsService = (DbSettingsService) ServiceLocator
.getInstance().getService(
ServiceLocator.Services.DBSETTINGS);
}
catch (Exception e)
{
logger.debug("error in AddressBookDelegate constructor", e);
}
}
public String getDatabaseUserNameFromSettings()
{
return dbSettingsService.getDatabaseUserNameFromSettings();
}
public String getDatabasePassswordFromSettings()
{
return dbSettingsService.getDatabasePasswordFromSettings();
}
public String getDatabaseServerNameFromSettings()
{
return dbSettingsService.getDatabaseServerNameFromSettings();
}
public String getDatabaseNameFromSettings()
{
return dbSettingsService.getDatabaseNameFromSettings();
}
public String checkWhetherDatabaseConnectionExists(String theUserName,String thePassword,String theDatabaseName,String theServerName)
{
return dbSettingsService.checkWhetherTheDatabaseConnectionExists(theUserName, thePassword, theDatabaseName, theServerName);
}
这是检索数据库详细信息并显示给用户的代码
ServletContext servletContext = FacesUtil.getServletContext();
this.context = (AbstractApplicationContext)WebApplicationContextUtils
.getRequiredWebApplicationContext(servletContext);
String valueForTheProperty = "";
DriverManagerDataSource databaseSource = null;
context.refresh();
databaseSource = (DriverManagerDataSource)context.getBean("dataSource");
if(theProperty.equalsIgnoreCase("username"))
{
valueForTheProperty = databaseSource.getUsername();
}
else if(theProperty.equalsIgnoreCase("password"))
{
valueForTheProperty = databaseSource.getPassword();
}
else if(theProperty.equalsIgnoreCase("server"))
{
valueForTheProperty = this.splitUrlAndGetValueForKey(databaseSource.getUrl(), "server");
System.out.println("Server: "+valueForTheProperty);
}
else
{
valueForTheProperty = this.splitUrlAndGetValueForKey(databaseSource.getUrl(), "databasename");
}
更新
调试代码时,我在控制台中找到了这些行。调用context.refresh()
时
Dec 28, 2010 3:22:44 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: Running hbm2ddl schema update
Dec 28, 2010 3:22:44 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: fetching database metadata
Dec 28, 2010 3:22:44 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: updating schema
Dec 28, 2010 3:22:44 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: schema update complete
所以我可以假设有一些更新。无法确定我为什么一直获取旧值
更新
完整的applicationCOntext.xml文件
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:/bundle/database.properties</value>
</property>
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" scope="prototype">
<property name="location">
<value>classpath:/bundle/database.properties</value>
</property>
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- Hibernate SessionFactory Definition -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.cglib.use_reflection_optimizer">
true
</prop>
<prop key="hibernate.cache.provider_class">
org.hibernate.cache.HashtableCacheProvider
</prop>
<prop key="hibernate.connection.useUnicode">true</prop>
<prop key="hibernate.connection.characterEncoding">UTF-8</prop>
</props>
</property>
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
<!-- Spring Data Access Exception Translator Definition -->
<bean id="jdbcExceptionTranslator"
class="org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator">
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
<!-- Hibernate Template Definition -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
<property name="jdbcExceptionTranslator">
<ref bean="jdbcExceptionTranslator" />
</property>
</bean>
<!--
========================= Start of SERVICE DEFINITIONS
=========================
-->
<!-- Hibernate Transaction Manager Definition -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<!-- AddressBook Service Definition -->
<bean id="loginServiceTarget" class="com.smartcall.service.impl.LoginServiceImpl">
<property name="loginDAO">
<ref local="loginDAO" />
</property>
</bean>
<!-- Login DAO Definition: Hibernate implementation -->
<bean id="loginDAO"
class="com.smartcall.dao.hibernate.HibernateLoginDAO">
<property name="hibernateTemplate">
<ref bean="hibernateTemplate" />
</property>
</bean>
<!-- Transactional proxy for the AddressBook Service -->
<bean id="loginService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager" />
</property>
<property name="target">
<ref local="loginServiceTarget" />
</property>
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
这些值在应用程序启动时读取,它们被设置为目标对象(本例中的数据源),并且不再读取属性文件。因此,即使您更改了这些值,它们也不会反映在任何地方 对于
PropertyPlaceHolderConfigure
要重新加载值,必须对其进行扩展并指定重新加载周期。但这仍然无法更新数据源。您还应该扩展数据源类,并使其在给定的时间间隔后重新读取属性。或者您可以将数据源
声明为范围原型
,以便每次获得一个新实例,并重新加载属性
如果您不想重新启动整个上下文(这可能需要很多时间)您需要重新启动应用程序上下文并再次获取beandriverManager数据源
,以反映写入属性文件的更改
context.refresh();
DriverManagerDataSource databaseSource = (DriverManagerDataSource)context.getBean("dataSource");
databaseSource.getUsername();
获取资源文件对象的提示:
URI a = getClass().getResource("/com/smartcall/bundle/database.properties").toURI();
File file = new File(a);
您不需要解码路径,即将%20替换为“” ???我不明白这个问题。“你想要什么?”肖恩很抱歉没有把我的问题说清楚。我创建了一个dbsettings页面,用户可以在其中输入要连接的数据库。要实现这一点,我需要以编程方式更新数据库设置。所以我尝试了这些步骤above@Sean我的评论现在清楚了吗?+1作为解释。我不想按指定的间隔重新加载属性文件。我只想在用户更新数据库设置后立即反映更改。关于第二点,我需要用这个更新applicationcontext文件吗?我这样做了,但没有成功。您是否尝试过刷新您的上下文?由于您的上下文很小,您可能不需要担心花费大量时间。@mvg我从来没有这样使用过它。我的建议是使用调试工具检查上下文对象的运行时类型。如果它是AbstractApplicationContext或AbstractApplicationContext的任何派生类,则可以更改其类型。根据Spring API,所有实现的WebApplicationContext类都应派生自AbstractApplicationContext。我认为将字段类型更改为AbstractApplicationContext是安全的。NullPointerException可以是任何类型。您必须对此进行调试,我无能为力。是否在context.refresh()行中抛出错误?在那条线上,它看起来不像是被索恩。您能检查一下DbSettingsBean.java中的第41行、第49行和dbsettingsdegate.java中的第38行是什么吗?这些是抛出错误的地方。你也从上下文中得到了其他bean吗?如果是这样的话,您需要再次获得它。如果您需要更多帮助,请向我展示您的DbSettingsBean.java和DbSettingsBean.java。@gigadot谢谢您的评论。我会检查一下,然后再回复您您的applicationContext.xml不包含这两个bean,对吗?它也有dbSettingsService的定义吗?如果您从其他地方的上下文中获得任何bean,则当您调用刷新方法时,对其他地方bean的引用将不会更新。如果dbSettingsService依赖于您的上下文,请确保它也已更新。否则会指向老豆子再提神。正如您所看到的,这是设计问题。解决这个问题没有简单的方法,除非重新加载你的webapp。许多Web应用程序都使用这种方法,但我也不喜欢。顺便问一下,是否有必要使用DbSettingsDelegate类?你在做额外的工作来跟踪变化吗?另一件事,从堆栈跟踪中,我无法判断错误是否是从上面粘贴的servlet代码部分抛出的。所有代码行都不涉及DBSettingBean和DbSettingsDelegate类。也许以后会被扔到别的地方?尝试调试或打印更长的堆栈跟踪。
URI a = getClass().getResource("/com/smartcall/bundle/database.properties").toURI();
File file = new File(a);