【问题标题】:Adding system properties in Spring MVC webapp在 Spring MVC webapp 中添加系统属性
【发布时间】:2014-12-31 15:44:10
【问题描述】:

我在通过 Tomcat 7 发布的 Spring MVC webapp 中使用 Hibernate 4.3.7.Final 和 Log4j2。所有配置都通过 JavaConfig 完成(即没有 web.xml 或其他 XML 配置文件)。

默认情况下,Hibernate 日志记录不通过 Log4j,原因在 Apache wiki 中进行了解释。为了解决这个问题,我需要创建一个系统设置,如下所示:

System.setProperty("org.jboss.logging.provider", "slf4j");

由于我的应用程序是一个 web 应用程序,因此没有主线程,因此我不确定将这个 System.setProperty 调用放在哪里。任何建议将不胜感激。

【问题讨论】:

  • 您使用的是哪个网络容器?

标签: java hibernate spring-mvc log4j2


【解决方案1】:

您可以在上下文侦听器中定义此系统属性,这是第一个入口点,如下所示:

@WebListener
public class ContextListenerExample implements ServletContextListener {
    public void contextInitialized(ServletContextEvent e){
        System.setProperty("org.jboss.logging.provider", "slf4j");
    }
}

您甚至可以使用 spring 定义系统属性,如下所示:

<bean id="setupJBossLoggingProperty"
    class="org.springframework.batch.support.SystemPropertyInitializer"
       p:keyName="org.jboss.logging.provider" p:defaultValue="slf4j"/>

然后你可以这样说:

<bean id="entityManagerFactory"
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
     depends-on="setupJBossLoggingProperty">
 ...

所以这意味着系统属性将首先被设置,然后休眠 bean 将被初始化。

【讨论】:

  • 我尝试将 ContextListenerExample 类添加到我的项目中,但必须将其声明为抽象。但是,当我运行我的 MVC Web 应用程序时,我看不到该应用程序会访问 contextInitialized 中的方法。是否还有其他需要添加到项目中的内容?在我的特殊情况下,我正在设置 trustStore 和 keyStore 属性。
【解决方案2】:

如果您使用一些 WebApplicationInitializer 实现来引导您的 Spring 应用程序(我假设您是因为您没有 web.xml),您可以将其放入 onStartup() 方法中,如下所示:

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
    System.setProperty("org.jboss.logging.provider", "slf4j");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 2016-04-24
    • 2011-12-02
    • 2011-02-16
    • 2015-07-25
    • 1970-01-01
    • 2012-04-01
    相关资源
    最近更新 更多