java - 如何在 spring 中将属性设置为 WEB-INF 中的路径名?

标签 java spring web-applications

我有一个必须用绝对路径名初始化的类。我想用路径名初始化它的是一个位于 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无关。为您的帮助而投票,并提出另一个问题。

最佳答案

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

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

这样比较灵活,可以使用Resource接口(interface)上的各种方法来获取底层文件路径名之类的东西,比如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;
    }
}

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

<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>

关于java - 如何在 spring 中将属性设置为 WEB-INF 中的路径名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3390872/

相关文章:

java - Eclipse TestNG java.lang.AssertionError

java - Spring Boot Property Yml/Properties with List 结构

java - 如何在课后回滚事务(使用 TestNg 和 Spring)?

python - 什么是分布式锁,为什么要使用它?

java - 用 Java 写入 Perl 进程输入流

java - 为什么在推断数组类型时 java 类型不安全?

java - Java transient 关键字是语法糖吗?

java - 在 Web 应用程序中重用已实现的业务类

java - 从哈希线性探针中删除

java - 如何在 Spring 中获取单例 Controller 的原型(prototype) bean?