【问题标题】:Update database settings in properties file in Spring在 Spring 中更新属性文件中的数据库设置
【发布时间】:2010-12-25 11:55:57
【问题描述】:

我是春天的新手 我正在尝试创建一个数据库管理器页面,该页面在页面加载时显示数据库详细信息,并在用户按下提交时更新数据库设置

我关注this tutorial并在属性文件中设置数据库设置。

我设法以编程方式更新了属性文件中的数据库设置。当我使用以下代码检索数据库设置时

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>

我检查了属性文件,发现它已使用最新输入进行更新。

我错过了什么?

提前致谢

P.S 我在 Spring 3 中使用 JSF1.2

更新

只是让我的要求变得简单。我正在创建一个单独的 dbsettings 页面,这样当用户希望连接到不同的数据库时,他/她可以在 dbsettings 页面中输入详细信息并连接

更新

我使用这段代码来检索应用程序上下文

private ApplicationContext context;

....

ServletContext servletContext = FacesUtil.getServletContext();
    this.context = WebApplicationContextUtils
            .getRequiredWebApplicationContext(servletContext);

如果我把它改成 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)

当我注释掉这一行时

context.refresh()

应用程序运行良好。请帮忙

更新

DBSettingBean

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文件

<?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>

context.refresh() 刷新了我认为的整个 applicationContext bean。好的,现在我删除了中间的那些委托和服务,应用程序现在直接调用

我现在没有使用 DBSettingsDelegate

更新

更新属性文件代码

Properties properties = new Properties();
    String a = Thread.currentThread()
                .getContextClassLoader()
                .getResource("/com/smartcall/bundle/database.properties").getFile();

    a = a.replaceAll("%20", " ");
    String url = "";

        url = "jdbc:mysql://"+theServerName+":3306/"+theDatabaseName+"?characterEncoding=UTF-8";
        File file = new File(a);
        //file.setWritable(true);

        System.out.println(url);
        System.out.println(file.getAbsolutePath());

        FileInputStream stream = new FileInputStream(file);
        properties.load(stream);

        properties.put("jdbc.username", theUserName);
        properties.put("jdbc.password", thePassword);
        properties.put("jdbc.url", url);            

        properties.store(new FileOutputStream(file),null);  

【问题讨论】:

  • ???我不明白这个问题。你想要什么?
  • @Sean 很抱歉没有把我的问题说清楚。我创建了一个 dbsettings 页面,用户可以在其中输入他们想要连接的数据库。为此,我需要以编程方式更新数据库设置。所以我尝试了上面的步骤
  • @Sean 我的评论现在清楚了吗?

标签: java spring jsf


【解决方案1】:

您需要 refresh 您的应用程序上下文并再次获取 bean DriverManagerDataSource 以反映写入属性文件的更改。

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 替换为 " "。 Referrence

【讨论】:

  • 是否在 context.refresh() 行抛出错误?它似乎没有在那条线上被刺穿。你能检查一下 DbSettingsBean.java 中的第 41、49 行和 DbSettingsDelegate.java 中的第 38 行是什么吗?这些是引发错误的地方。您是否也从上下文中获得了其他 bean?如果是这样,您将需要再次获取它。如果您需要更多帮助,请告诉我您的 DbSettingsBean.java 和 DbSettingsBean.java。
  • @gigadot 感谢您的评论。我会检查并回复你
  • 您的 applicationContext.xml 不只包含这两个 bean,对吧?它也有dbSettingsService的定义吗?如果您从其他地方的上下文中获取任何 bean,当您调用 refresh 方法时,对其他地方的 bean 的引用将不会被更新。
  • 如果 dbSettingsService 取决于您的上下文,请确保它也已更新。否则会在刷新前指向老bean。如您所见,这是设计问题。除了重新加载您的 webapp 之外,没有简单的方法可以解决这个问题。许多 webapps 使用这种方法,但我也不喜欢它。
  • 顺便说一句,是否需要有 DbSettingsDelegate 类?您是否正在做额外的工作来跟踪变化?另一件事,从您的堆栈跟踪中,我无法判断错误是否是从您上面粘贴的 servlet 代码部分引发的。没有任何代码行涉及 DBSettingBean 和 DbSettingsDelegate 类。也许它稍后会被扔到其他地方?尝试调试或打印更长的堆栈跟踪。
【解决方案2】:

在应用程序启动时读取这些值,将它们设置为目标对象(在您的情况下为数据源),并且不再读取属性文件。因此,即使您更改了值,它们也不会反映在任何地方。

要让PropertyPlaceholderConfigurer 重新加载值,您必须扩展它并指定重新加载周期。但这仍然不会更新数据源。您还应该扩展数据源类并使其在给定时间间隔后重新读取属性。或者您可以将DataSource 声明为prototype 范围,这样每次都会获得一个新实例,并重新加载属性。

如果您不想重新启动整个上下文(这可能需要很长时间)

【讨论】:

  • +1 进行解释。我不想在指定的时间间隔重新加载属性文件。我只想在用户更新数据库设置后立即反映更改。关于第二点,我是否需要用这个 我这样做了但没有成功
  • 您是否尝试过刷新上下文?由于您的上下文很小,您可能不必担心会花费大量时间。
  • @mvg 我从来没有这样用过。我的建议是使用调试工具检查上下文对象的运行时类型。如果是 AbstractApplicationContext 或 AbstractApplicationContext 的任何派生类,则可以更改其类型。
  • 根据Spring API,所有实现的WebApplicationContext类都应该派生自AbstractApplicationContext。我会说将字段类型更改为 AbstractApplicationContext 是安全的。
  • NullPointerException 可以是任何东西。你必须调试它,我无能为力。
猜你喜欢
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-12
  • 2018-09-02
  • 1970-01-01
相关资源
最近更新 更多