【问题标题】:Reading ResourceBundle in WebApplicationInitializer在 WebApplicationInitializer 中读取 ResourceBundle
【发布时间】:2013-11-05 04:20:34
【问题描述】:

是否可以在 WebApplicationInitializer 中的 Web 应用程序初始化期间读取资源包?我在 WebApplicationInitializer 中初始化了一个过滤器,我想从文件中读取 init-params。

我尝试过这种方式,但是当我尝试调用 setInitParameter("unprotectedUrls", 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...");

}

}

【问题讨论】:

    标签: spring-mvc initializer


    【解决方案1】:

    当然,为什么不呢?

    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。您几乎可以从任何地方读取这些属性。

    【讨论】:

    • 有没有办法用 Spring 的东西做到这一点?喜欢@PropertySource("xxx.properties")?
    • @user233552 您可以在某个 bean 的某个字段上添加 @Value 注释,但您必须检索它并将值复制到 setInitParameter() 方法中。
    • 在我上面的代码中,您可以看到我这样做了,但 @Value 注释字段为空,因此,我使用空值调用 setInitParameter(..)。
    • @user @Value 仅适用于 Spring 托管对象。 MyConfigInitializer 实例由 servlet 容器创建,不是 Spring 托管的 bean。
    【解决方案2】:
    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();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-12-21
      • 2016-03-21
      • 2013-08-31
      • 2010-09-15
      • 1970-01-01
      • 2012-11-15
      • 2017-05-27
      • 2016-04-01
      • 2017-03-22
      相关资源
      最近更新 更多