自定义过滤器未读取属性文件,该文件位于使用该过滤器的 Web 应用程序中
Custom Filter is not Reading Properties File, which is placed within a WEB app consuming that Filter
我正在构建一个简单的 Java 过滤器,最终将在不同的 WEB 应用程序中进行配置。该 WEB 应用程序将在 web.xml 内配置此过滤器并提供一个初始参数,其值为属性文件的路径。
自定义过滤器应该读取此属性文件。不过我无法读取此属性文件。
这里是 CustomFilter 的代码。这是安装到 jar 文件中的 maven。
public class CustomFilter implements Filter{
...
// invoked from init()
Properties loadProperties(FilterConfig filterConfig) {
String initParamName = "someParamName";
String pathToProperties = filterConfig
.getInitParameter(initParamName);
LOG.info("Path to Properties File is:" + pathToProperties);
InputStream input = null;
Properties properties = new Properties();
try {
// Read the Properties file a Stream
/*input = Thread.currentThread().getContextClassLoader()
.getResourceAsStream(pathToProperties);*/ // input is null
/*input = this.getClass()
.getResourceAsStream(pathToProperties);*/ // input is null
ServletContext servletContext = filterConfig.getServletContext();
LOG.info("servletContext.getContextPath(): " + servletContext.getContextPath());
//LOG.info("servletContext.getContextPath(): " + servletContext.get;
//input = servletContext.getResourceAsStream(pathToProperties); //input is null
input = servletContext.getClass().getClassLoader().getResourceAsStream(pathToProperties);
//input is null
LOG.info("+++++++++++++++++++++++++==" + input);
// Load Stream to Properties, key=value in properties file gets
// converted to [key:value] prop
properties.load(input);
} catch (IOException e) {
...
}
return null;
}
}
上面创建的 jar 文件通过 Maven POM 包含在 REST 服务项目中。
REST 服务中过滤器的 web.xml 配置是
<filter>
<filter-name>customFilter</filter-name>
<filter-class>com.abc.xyz.CustomFilter</filter-class>
<init-param>
<param-name>someParamName</param-name>
<param-value>hello.properties</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>customFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
属性文件 hello.properties 保存在 REST 服务项目中,与 web.xml 所在的位置相同。
请注意:
当相同的属性文件保存在第一个 jar 中时,在创建 CustomFilter 的包中,代码可以完美运行。然而,这不是我们打算做的。
此外,我无法使用基于 SPRING 的解决方案来读取属性文件。仅 Java 基于。
您想要加载文件夹 /WEB-INF
中的资源(您说它位于 与 web.xml
相同的位置)。
ServletContext.getResourceAsStream
是要走的路,但您需要在资源名称前加上前缀 /WEB-INF/
:
String pathToProperties = "/WEB-INF/" + filterConfig.getInitParameter("someParamName");
InputStream input = filterConfig.getServletContext().getResourceAsStream(pathToProperties);
我正在构建一个简单的 Java 过滤器,最终将在不同的 WEB 应用程序中进行配置。该 WEB 应用程序将在 web.xml 内配置此过滤器并提供一个初始参数,其值为属性文件的路径。
自定义过滤器应该读取此属性文件。不过我无法读取此属性文件。
这里是 CustomFilter 的代码。这是安装到 jar 文件中的 maven。
public class CustomFilter implements Filter{
...
// invoked from init()
Properties loadProperties(FilterConfig filterConfig) {
String initParamName = "someParamName";
String pathToProperties = filterConfig
.getInitParameter(initParamName);
LOG.info("Path to Properties File is:" + pathToProperties);
InputStream input = null;
Properties properties = new Properties();
try {
// Read the Properties file a Stream
/*input = Thread.currentThread().getContextClassLoader()
.getResourceAsStream(pathToProperties);*/ // input is null
/*input = this.getClass()
.getResourceAsStream(pathToProperties);*/ // input is null
ServletContext servletContext = filterConfig.getServletContext();
LOG.info("servletContext.getContextPath(): " + servletContext.getContextPath());
//LOG.info("servletContext.getContextPath(): " + servletContext.get;
//input = servletContext.getResourceAsStream(pathToProperties); //input is null
input = servletContext.getClass().getClassLoader().getResourceAsStream(pathToProperties);
//input is null
LOG.info("+++++++++++++++++++++++++==" + input);
// Load Stream to Properties, key=value in properties file gets
// converted to [key:value] prop
properties.load(input);
} catch (IOException e) {
...
}
return null;
}
}
上面创建的 jar 文件通过 Maven POM 包含在 REST 服务项目中。 REST 服务中过滤器的 web.xml 配置是
<filter>
<filter-name>customFilter</filter-name>
<filter-class>com.abc.xyz.CustomFilter</filter-class>
<init-param>
<param-name>someParamName</param-name>
<param-value>hello.properties</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>customFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
属性文件 hello.properties 保存在 REST 服务项目中,与 web.xml 所在的位置相同。
请注意: 当相同的属性文件保存在第一个 jar 中时,在创建 CustomFilter 的包中,代码可以完美运行。然而,这不是我们打算做的。
此外,我无法使用基于 SPRING 的解决方案来读取属性文件。仅 Java 基于。
您想要加载文件夹 /WEB-INF
中的资源(您说它位于 与 web.xml
相同的位置)。
ServletContext.getResourceAsStream
是要走的路,但您需要在资源名称前加上前缀 /WEB-INF/
:
String pathToProperties = "/WEB-INF/" + filterConfig.getInitParameter("someParamName");
InputStream input = filterConfig.getServletContext().getResourceAsStream(pathToProperties);