4

私は CQ5 ベースのアプリに取り組んでいます。これは、以前は主に Spring ベースの Web アプリに取り組んでいたため、まったく新しい分野です。

このアプリは、Blue-prints アーキタイプ (http://www.cqblueprints.com/xwiki/bin/view/Blue+Prints/The+CQ+Project+Maven+Archetype) に基づく Maven プロジェクトです。

ここで質問があります。いくつかのプロパティを追加するための標準的なアプローチは何ですか。これは通常、標準の web-app の config.properties (または同様の) ファイルに移動します。hostNames、accountNumbers などを含むプロパティ。

乾杯。

4

3 に答える 3

6

私はブループリントに詳しくありませんが、これは CQ プロジェクト構造を生成するための単なる方法であることを理解しているため、構成パラメーターの管理方法に実際の影響はないと思います。

CQ5 はApache Slingに基づいており、構成可能なパラメーターに OSGi ConfigAdmin サービスを使用し、これを簡単にするいくつかのツールを提供します。

@Component アノテーションを使用してそれ自体を OSGi コンポーネントとして宣言するPathBasedDecorator Sling コンポーネントでその例を見ることができます。

@Component(metatype=true, ...)

その後、 @Property アノテーションを使用して、複数値の構成可能なパラメーターをデフォルト値で宣言します。

@Property(value={"/content:2", "/sling-test-pbrt:2"}, unbounded=PropertyUnbounded.ARRAY)
private static final String PROP_PATH_MAPPING = "path.mapping";

その値は、コンポーネントの activate() メソッドで読み取られます。

  final Dictionary<?, ?> properties = componentContext.getProperties();
  final String[] mappingList = (String[]) properties.get(PROP_PATH_MAPPING);

また、そのコンポーネントを含む OSGi バンドルは、構成可能なパラメーターの名前とラベルを定義するためのmetatype.propertiesファイルを提供します。

それだけです。これにより、Sling と OSGi フレームワークは、/system/console/config からアクセスできるコンポーネントの基本的な構成 UI を生成し、構成パラメーターが変更された場合にコンポーネントのアクティブ化と再アクティブ化を自動的に管理します。

これらの構成は、JCR リポジトリから取得することもできます。Sling インストーラーがそれらを取得するため、CQ5 リポジトリの /libs および /apps の下にある「config」という名前のフォルダーに多数の構成が含まれています。

もう 1 つのオプションは、構成可能なパラメーターの使用方法に応じて、JCR コンテンツを直接使用することです。その構成がリポジトリの /apps/foo/myparameters の下にあることをコンポーネントに伝え (そしてその値だけを構成可能にする)、必要に応じてそのノードの下に JCR プロパティと子ノードを追加して、コンポーネントが読み取れるようにすることができます。欠点は、OSGi 構成を直接使用する場合のように、パラメーターが変更されたときに @Component が自動的に再起動されないことです。

長い説明...これが役立つことを願っています;-)

于 2013-01-17T09:02:51.883 に答える
1

バートランドに感謝します。あなたの答えは本当に私を正しい方向に向けてくれました。

私がしたことは、実行モードごとに .ConfigService.xml を作成したことです。これは次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0"         xmlns:jcr="http://www.jcp.org/jcr/1.0"
jcr:primaryType="sling:OsgiConfig"
myconfig.config="{String}My Value"/>

次に、私の ConfigService では次のようになりました。

@Component(immediate = true, metatype = true)
@Service(ConfigService.class)
public class ConfigService {

    private Dictionary<String, String> properties;

    @SuppressWarnings("unchecked")
    protected void activate(ComponentContext context) {
        properties = context.getProperties();
    }

    protected void deactivate(ComponentContext context) {
        properties = null;
    }

    public String getProperty(String key) {
        return properties.get(key);     
    }
}

@Reference を使用してアクセスする構成プロパティを取得する必要がある場合は、単に ConfigService を使用します。

それが誰かを助けることができることを願っています!

于 2013-01-18T02:28:06.443 に答える
0

ComponentContext はコンポーネントのアクティブ化および非アクティブ化中にのみ依存する必要があるため、ConfigService の例は最善のアプローチではない可能性があります。

于 2013-01-31T18:06:56.563 に答える