3

私はこれについて完全な初心者なので、事前にお詫び申し上げます。hello world メッセージを表示するだけで、felix からの入力を介して構成可能な OSGi コンポーネントを作成しようとしています。次に、それをjspページに吐き出します。これを行うために scr 注釈を使用しています。これが私のJavaコードです

package com.training.cq5.trainingApp;

import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.osgi.service.component.ComponentContext;
import org.apache.sling.commons.osgi.PropertiesUtil;

@Component(label= "Welcome Message",
        description = "Welcome Message for the training excercise",
        immediate = true, enabled = true, metatype=true)
@Properties({
    @Property(name = "welcome.message", value = "WelcomeMessage")
})
@Service(WelcomeMessage.class)
public class WelcomeMessage {

    private static String welcome_message = "Welcome";

    @Activate
    protected void activate(ComponentContext ctx) {
        welcome_message = PropertiesUtil.toString(ctx.getProperties().get(welcome_message), welcome_message);
    }

    public static String getMessage() { 
        return welcome_message;
    }
}

JSPでそれを呼び出しているのは次のとおりです。

<%@ page import="com.training.cq5.trainingApp.WelcomeMessage" %>

<h2><%= WelcomeMessage.getMessage() %></h2>

フェリックスから更新されない理由はありますか? 私が得ているのは、welcome_message 文字列からの「ようこそ」テキストだけです。

4

3 に答える 3

6

WelcomeMessage.getMessage() に静的メソッドとしてアクセスしていますが、必要なのは実際のサービスです。クラスに @Service および @Component アノテーションを付ける場合、このクラスのインスタンスをサービスとして登録する必要があることを OSGI フレームワークに示します。このサービス インスタンスは、OSGI フレームワークによって、そのライフサイクル (インスタンス化されたとき)、または適切なクラスがロードされるクラスローダーによって管理されます。

ただし、 @Component および @Service アノテーションを使用するには、Apache Felix SCR pluginを使用する必要があります。それが機能すると、サービスがインスタンス化されます。

次に、サービスにアクセスする必要があります。あなたが使用しているように見える Sling で最も簡単な方法は、サービスを検索できるSlingScriptHelper.getService()です。

アップデート

OSGI では、サービスはタイプごとに登録されます。@Service(MyClass.class) でサービスを宣言すると、サービスは MyClass 型で登録されます。それを取得するには、指定されたタイプのサービスのサービス レジストリを照会します。Java コードでは、getServiceReference(Class clazz) / getService(ServiceReference reference) @Referenceアノテーションを使用します。

Sling システム上の JSP では、前述のように SlingScriptHelper を使用できます。短いコード サンプルを次に示します (インポートが正しく行われていることを前提としています)。

<%
SlingBindings bindings = (SlingBindings) req.getAttribute(SlingBindings.class.getName());
SlingScriptHelper scriptHelper = bindings.getSling();
MyService service = scriptHelper.getService(MyService.class);
// ... do stuff with service.
%>

OSGI をさらに使用する場合は、OSGI 仕様を強くお勧めします。ダウンロードは無料で、すべてが非常に詳細に説明されています。

于 2013-04-03T03:43:15.250 に答える
0

この行を変更してください:- welcome_message = PropertiesUtil.toString(ctx.getProperties().get(welcome_message), welcome_message);

welcome_message = PropertiesUtil.toString(ctx.getProperties().get("welcome.message"), welcome_message);

違いに注意してください:-ctx.getProperties().get( welcome_message ) 対 ctx.getProperties().get( "welcome.message" )

于 2016-02-19T10:38:34.170 に答える