自定义过滤器未读取属性文件,该文件位于使用该过滤器的 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);