3

プロパティに hbase テーブルからの読み取りを使用するカスタム ResourceLoader を作成する方法を探しています。独自の ApplicationContext を作成し、getResource をオーバーライドして、独自の ResourceLoader を使用できることがわかりました。

@Override
public Resource getResource(String location) {
    if (location.startsWith(HbaseResource.HBASE_PREFIX) ) {
        ResourceLoader loader = (ResourceLoader)getBean(HbaseResourceLoader.class);
        return loader.getResource(location);
    } else{
        return super.getResource(location);
    }
}

ClasspathXmlApplicationContext のみを使用し、独自の contxt クラスを作成せずに、同じ結果を得る方法を探しています。ResourceLoaderAwareについて読むと、次の行が表示されます。

ResourcePatternResolver 依存関係の代わりに、Bean ファクトリによる自動型変換を使用してパターン文字列を介して入力された Resource 配列型の Bean プロパティを公開することを検討してください。

これは何らかの形で私を助けることができますか? カスタムResourceLoaderを登録するのに見逃した別の方法はありますか?

4

1 に答える 1

2

ResourceLoaderは一種の特別なビルディングブロックであり、他のコンテナサービスのように直接注入することはできませんが、型変換に関する観察が役立つと思います。自分に合った機能を備えたConversionService(Bean名 "conversionService")をインストールできます。変換が必要になる前に登録されていることを確認できれば、機能すると思います。それをどのように行うかは、おそらくXMLと@Configurationのどちらを使用するかによって異なります。簡単なおもちゃの例:

@Test
public void testResource() {
    System.setProperty("value", "123");
    System.setProperty("resource", "location:not.found");
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
    context.register(TestConfig.class);
    context.refresh();
    Resource resource = context.getBean("resource", Resource.class);
    assertTrue(resource.exists());
}

@Configuration
@Import(ConversionConfig.class)
public static class TestConfig {

    @Value("${resource}")
    private Resource resource;

    @Bean
    public Resource resource() {
        return resource;
    }

    @Bean
    public static PropertySourcesPlaceholderConfigurer placeholders() {
        return new PropertySourcesPlaceholderConfigurer();
    }

}

@Configuration
public static class ConversionConfig {

    @Bean
    protected ConversionService conversionService(final ResourceLoader loader) {
        GenericConversionService service = new GenericConversionService();
        service.addConverter(new Converter<String, Resource>() {
            public Resource convert(String location) {
                Resource resource = loader.getResource(location);
                if (resource.exists()) {
                    return resource;
                }
                return new ByteArrayResource("foo".getBytes());
            }
        });
        return service;
    }

}
于 2013-01-10T09:29:26.223 に答える