5

我想为自定义资源前缀编写一个自己的资源(来自 core.io 包)实现,例如“myprotocol:/root/test/foo.properties”。

最初的想法是引用 JCR 存储库中的 Apache Sling 资源路径来加载一些属性文件,然后 PropertyPlaceholderConfigurer 可以在 Spring 应用程序上下文中使用这些文件,例如:

<context:property-placeholder properties-ref="appConfig" ignore-unresolvable="true" />

<bean id="appConfig" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="locations">
        <list>
            <value>jcr:/app/test/foo.properties</value>
        </list>
    </property>
</bean>

有人知道如何实现吗?

谢谢你的帮助!奥利

4

2 回答 2

2

由于 Spring 4.3DefaultResourceLoader现在有一个addProtocolResolver()方法允许您提供接口的实现,该ProtocolResolver接口采用 String 并返回您的实现,ResourceLoader如果您能够加载由 String 值标识的资源。

于 2017-04-13T10:14:40.293 回答
1

资源路径的解析在 DefaultResourceLoader 类的 getResource(String) 方法中以固定方式执行,该类是所有应用程序上下文的超类。

如何解决问题的一个想法是对应用程序上下文进行子类化。

public class CustomXmlApplicationContext extends AbstractXmlApplicationContext {

    private final CustomResourceLocator customResourceLocator;

    @Override
    public Resource getResource(String location) {
        Assert.notNull(location, "Location must not be null");
        if (location.startsWith("custom:")) {
            return customResourceLocator.getResource(location);
        }
        return super.getResource(location);
    }

}
于 2013-12-08T18:03:40.900 回答