2013-12-12 169 views
0

我有一個Spring PrimeFaces JSF應用程序被配置爲通過實現WebApplicationInitializer而不是web.xml(儘管我還有一個空的web.xml)的類加載應用程序。問題是在應用程序啓動時,基本上在整個應用程序中,方法被調用兩次!我發現的最佳解釋是可能會對其中一個聽衆進行雙重加載。我沒有看到我正在那樣做。下面是我的WebApplicationInitializer類。我不知道還有什麼可以解決我的問題。即使託管bean方法被調用兩次。Spring方法被調用兩次

public class WebAppInitializer implements WebApplicationInitializer { 

@Override 
public void onStartup(ServletContext servletContext) throws ServletException { 

    final CharacterEncodingFilter cf = new CharacterEncodingFilter(); 
    cf.setEncoding("UTF-8"); 
    cf.setForceEncoding(true); 

    servletContext.addListener(new RequestContextListener()); 

    servletContext 
      .addFilter(
        "ShiroFilter", 
        org.apache.shiro.web.servlet.IniShiroFilter.class) 
      .addMappingForUrlPatterns(null, false, "/*"); 

    final WebApplicationContext context = getContext(); 
    servletContext.addListener(new ContextLoaderListener(context)); 

    final ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet", new DispatcherServlet(context)); 
    dispatcher.setLoadOnStartup(1); 
    dispatcher.addMapping("*.do"); 
} 

private AnnotationConfigWebApplicationContext getContext() { 
    final AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); 
    context.register(AppConfig.class); 

    return context; 
} 
} 

web.xml有臉的標準定義和下面的映射:

..... 
<context-param> 
    <param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name> 
    <param-value>true</param-value> 
</context-param> 
    ..... 
<!-- JSF Mapping --> 
<servlet> 
    <servlet-name>Faces Servlet</servlet-name> 
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>*.jsf</url-pattern> 
    <url-pattern>*.xhtml</url-pattern> 
</servlet-mapping> 

當應用程序啓動時,我看到春天輸出也被複制!

2013-12-12T11:29:56.430-0500|INFO: [org.springframework.web.context.support.AnnotationConfigWebApplicationContext] - Refreshing Root WebApplicationContext: startup date [Thu Dec 12 11:29:56 EST 2013]; root of context hierarchy 

2013-12-12T11:29:56.430-0500|INFO: [org.springframework.web.context.support.AnnotationConfigWebApplicationContext] - Refreshing Root WebApplicationContext: startup date [Thu Dec 12 11:29:56 EST 2013]; root of context hierarchy 

2013-12-12T11:29:56.978-0500|INFO: [org.springframework.context.annotation.ClassPathBeanDefinitionScanner] - JSR-250 'javax.annotation.ManagedBean' found and supported for component scanning 

2013-12-12T11:29:56.978-0500|INFO: [org.springframework.context.annotation.ClassPathBeanDefinitionScanner] - JSR-250 'javax.annotation.ManagedBean' found and supported for component scanning 

如何停止重複呼叫?謝謝。

編輯 我正在使用Log4j。下面是我的配置:

log4j.rootLogger=info, A1 
log4j.appender.A1=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.Target=System.out 
log4j.appender.A1.layout=org.apache.log4j.PatternLayout 
log4j.appender.A1.layout.ConversionPattern=[%c] %x - %m%n 
log4j.logger.org.hibernate=info, A1 
log4j.logger.com.telus=info, A1 
log4j.logger.org.springframework=info, A1 

使用Spring 3.1.4.RELEASE。 PrimeFaces 4.0。 JSF 2.1.7。部署在Glassfish 3上。Java 1.6.32。

+0

這似乎是一個記錄器問題。 –

+0

什麼我可以嘗試的指針?或者您需要的更多信息? – raylee

+0

你正在使用什麼日誌框架? Log4j,logback,其他?發佈您的記錄器配置。 –

回答

0

嘗試添加以下到您log4j.properties

log4j.additivity.org.hibernate=false 
log4j.additivity.com.telus=false 
log4j.additivity.org.springframework=false 

這應該確保日誌消息中不屬於母公司根記錄複製。