jsf - 以编程方式访问 JSF 应用程序中的属性文件

标签 jsf internationalization resources properties-file

我正在尝试以代码访问我在 JSF 应用程序中使用的 i18n 属性文件。 (这个想法是有一个页面,实际上将其键和值显示为表格。)

该项目是一个maven项目,在src/resources/localization文件夹下,并部署在WEB-INF\classes\localization\的war文件中

java.util.Properties prop = new java.util.Properties();
String path = "localization/stat_codes.properties";
InputStream foo = prop.getClass().getResourceAsStream(path);

但是无论我将路径变量设置为/WEB-INF/classes/localization/stat_codes.properties、“localization.stat_codes.properties”等,变量 foo 都为空。类似的问题是 here ,但那里也没有有用的答案。

最佳答案

Class#getResourceAsStream()可以采用相对于 Class 位置的路径你在那里使用它作为起点。因此,例如,如果该类位于 com.example包并且您请求路径foo/filename.properties , 那么它实际上会加载 com/example/foo/filename.properties文件。但是如果你使用 /foo/filename.properties , 那么它实际上会加载 foo/filename.properties从类路径根目录。
所以,你的代码

java.util.Properties prop = new java.util.Properties();
String path = "localization/stat_codes.properties";
InputStream foo = prop.getClass().getResourceAsStream(path);
实际上会寻找 java/util/localization/stat_codes.properties文件。
但是在具有复杂的多个类加载器层次结构的应用程序中,一个类加载器不是另一个。加载核心 Java 类的类加载器不一定知道 webapp 的 /WEB-INF/classes 中的文件。 .所以在路径前加上 /不一定是解决方案,它仍然会返回 null .
如果您可以保证当前类在与属性文件相同的类加载器中可见(因为它们位于类路径的同一子根目录中,例如 /WEB-INF/classes ,那么您确实应该使用
String path = "/localization/stat_codes.properties";
InputStream foo = this.getClass().getResourceAsStream(path);
但是,如果在某些时候,属性文件将被外部化,因为在运行时更容易维护/编辑,这样您就不需要在想要编辑文件时重新构建/重新部署/重新启动 webapp,那么上面的代码行也可能会失败。外部化位置只能由不同的类加载器访问。规范的解决方案是使用线程的上下文类加载器作为起点,它可以访问类路径中的所有资源。
String path = "localization/stat_codes.properties";
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream foo = loader.getResourceAsStream(path);
(请注意,此路径不能以 / 开头,它始终相对于公共(public)根)
也可以看看:
  • Where to place and how to read configuration resource files in servlet based application?
  • ExternalContext#getResourceAsStream() returns null, where to place the resource file?
  • 关于jsf - 以编程方式访问 JSF 应用程序中的属性文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7952090/

    相关文章:

    linux - 用不同的语言运行 Qt 应用程序?

    Javascript .toLocaleString() 返回错误的月份?

    java - 添加mvc后Spring MVC页面无法访问:resources

    vb.net - 如何使用Windows Media Player播放资源中的声音?

    java - 项目部署正确,但服务器返回404未找到

    css - 如何更改默认主页图标

    Qt 编码问题

    resources - 在哪里可以找到有关 VectorScript 编程语言的资源?

    jquery - 添加 jquery 插件的正确方法是什么

    jsf - 在页面加载时将焦点设置为特定的JSF inputText