2013-10-25 5 views
1

WebApplicationInitializer에서 웹 응용 프로그램을 초기화하는 동안 자원 번들을 읽을 수 있습니까? WebApplicationInitializer에서 초기화 된 필터가 있고 파일에서 init-params를 읽으려고합니다.WebApplicationInitializer에서 ResourceBundle 읽기

나는이 방법을 시도하지만 setInitParameter("unprotectedUrls", unprotectedUrls);

public class MyWebAppInitializer implements WebApplicationInitializer { 

@Value("unprotectedUrls") String unprotectedUrls; 


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

    System.out.println("Initializing My Web App..."); 
    AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); 
    rootContext.register(MyWebAppContext.class); 

    container.addListener(new ContextLoaderListener(rootContext)); 

    javax.servlet.ServletRegistration.Dynamic servlet = container.addServlet("MyServlet", new DispatcherServlet(rootContext)); 
    servlet.addMapping("/"); 
    servlet.setLoadOnStartup(1); 

    javax.servlet.FilterRegistration.Dynamic charEncodingFilterReg = container.addFilter("CharacterEncodingFilter", CharacterEncodingFilter.class); 
    charEncodingFilterReg.setAsyncSupported(true); 
    charEncodingFilterReg.setInitParameter("encoding", StandardCharsets.UTF_8.toString()); 
    charEncodingFilterReg.setInitParameter("forceEncoding", "true"); 
    charEncodingFilterReg.addMappingForUrlPatterns(null, false, "/*"); 

    javax.servlet.FilterRegistration.Dynamic authenticationFilterReg = container.addFilter("AuthenticationFilter", AuthenticationFilter.class); 
    authenticationFilterReg.setAsyncSupported(true); 

    container.setInitParameter("unprotectedUrls", unprotectedUrls); 
    System.out.println("unprotectedUrls: " + unprotectedUrls); 

    System.out.println("Initializing completed..."); 

} 

}

답변

0

물론 호출 할 때 unprotectedUrls가 null의 경우, 왜?

public class MyConfigInitializer implements WebApplicationInitializer { 
    @Override 
    public void onStartup(ServletContext servletContext) 
      throws ServletException { 
     ResourceBundle bundle = ResourceBundle.getBundle("my-file.properties"); 
     String initParamValue = bundle.getString("key"); 

     Dynamic registration = servletContext.addFilter("myFilter", "some.filter.qualified.name"); 
     registration.setInitParameter("key", initParamValue); 
    } 
} 

ResourceBundle을 사용할 필요가 없습니다. 거의 모든 곳에서 속성을 읽을 수 있습니다.

+0

스프링 재료로 할 수있는 방법이 있습니까? @PropertySource ("xxx.properties")와 비슷합니까? –

+0

@ user233552 일부 bean의 일부 필드에'@ Value' 주석을 넣을 수는 있지만 그것을 검색하여'setInitParameter()'메소드에 값을 복사해야합니다. –

+1

위의 코드에서 알 수 있듯이 @Value 주석이 달린 필드가 null이므로, null 값을 사용하여 setInitParameter (..)를 호출합니다. –

0
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 
    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException { 
     super.onStartup(servletContext); 
     Properties properties = new Properties(); 
     try (BufferedInputStream input = new BufferedInputStream(WebAppInitializer.class.getClassLoader().getResourceAsStream("app.properties"))) { 
      properties.load(input); 
      String value = properties.getProperty("memcached.profile"); 
      servletContext.setInitParameter("spring.profiles.active", value); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
}