【问题标题】:How to set a property in spring to a pathname inside of WEB-INF?如何在春季将属性设置为 WEB-INF 内的路径名?
【发布时间】:2011-03-24 09:10:55
【问题描述】:

我有一个必须用绝对路径名初始化的类。我想用它的路径名初始化它是一个位于 WEB-INF 中的文件。

我正在使用 Spring 的 ContextLoaderListener 来设置这一切,因此我无法运行 Java 代码来从上下文中获取路径并将其粘贴到 ${whatever} 可以找到它的位置。

考虑一些 bean 定义,例如:

<bean class="my.class">
  <property name="somePath" value="/WEB-INF/a.txt"/>
</bean>

如果可能的话,我需要一种方法来使该路径名通过 ServletContextResource 机制。类路径之类的似乎没有“前缀”:

在这种情况下,将项目放在类路径中将无济于事,相信我。

编辑

我去挖掘了 bean 类的来源,它已经接受了相关属性上的 Resources。所以这里发生了一些可笑的事情,它抱怨说好像找不到东西。为我打开调试器。

再次编辑

所以,这原来是一个 Maven 恶作剧,与 Spring 无关。到处都在为您的帮助点赞,并提出另一个问题。

【问题讨论】:

    标签: java spring web-applications


    【解决方案1】:

    我的偏好是将此类修改为采用Resource,而不是路径名。然后您可以使用以下方法注入它:

    <property name="fileResource" value="/WEB-INF/path/to/file"/>
    

    这样比较灵活,可以使用Resource接口上的各种方法来获取底层文件路径名之类的东西,比如getFile().getAbsolutePath()

    但是,如果修改目标类不可行,那么您需要某种方式将Resource 转换为路径名。您可以为此使用FactoryBean,例如:

    public class ResourcePathFactoryBean extends AbstractFactoryBean<String> {
    
        private Resource resource;
    
        @Required
        public void setResource(Resource resource) {
            this.resource = resource;
        }
    
        @Override
        protected String createInstance() throws Exception {
            return resource.getFile().getAbsolutePath();
        }
    
        @Override
        public Class<?> getObjectType() {
            return String.class;
        }
    }
    

    然后您可以使用它来注入您的路径:

    <bean id="myBean" class="com.MyBean">
       <property name="path">
          <bean class="com.ResourcePathFactoryBean">
             <property name="resource" value="/WEB-INF/path/to/file"/>
          </bean>
       </property>
    </bean>
    

    【讨论】:

      【解决方案2】:

      文件在类路径上吗?

      在你的bean中,你可以有一个Resource fileResource这样的属性,然后在你的bean中设置它

      <property name="fileResource" value="classpath:/path/to/the/file"/>
      

      Spring Resource interface 有一个名为getFile() 的方法,它将返回资源的文件句柄。从那里您可以简单地拨打File.getAbsolutePath()

      【讨论】:

      • 不在类路径中。我期望 ServletContextResource 用于属性值,因为这是一个 WebApp 上下文,但没有这样的运气。可能是因为该属性(不受我控制)是字符串而不是文件。
      猜你喜欢
      • 2021-04-20
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多