OSGi-Komponente konfigurierbar über Apache Felix
Ich bin ein absoluter newb auf diesem so entschuldige ich mich im Voraus. Ich bin versucht zu erstellen
eine OSGi-Komponente, die zeigt einfach ein Hallo-Welt-Nachricht und ist konfigurierbar über die Eingabe von felix. Dann spuckt es aus, auf einer jsp-Seite. Ich bin mit scr Anmerkungen zu helfen, dies tun. Hier ist mein java-code
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;
}
}
Hier bin ich der Aufruf in der JSP:
<%@ page import="com.training.cq5.trainingApp.WelcomeMessage" %>
<h2><%= WelcomeMessage.getMessage() %></h2>
Gibt es einen Grund, warum es nicht zu aktualisieren, die von felix? Alles, was ich bekommen, ist "Willkommen"
text aus der welcome_message string.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Sie zugreifen WelcomeMessage.getMessage() als statische Methode, aber was Sie wollen, ist die eigentliche Leistung. Wenn Sie Anmerkungen ein-Klasse mit der @Service und @Component-annotation, teilen Sie das OSGI-framework, dass Sie eine Instanz dieser Klasse als service registriert. Diese service-Instanz verwaltet wird durch das OSGI-framework, in Bezug auf den Lebenszyklus (wenn Ihr instanziiert) oder durch die classloader, der die entsprechenden Klassen geladen werden.
Jedoch um die Verwendung der @ - Komponente und @Service Anmerkungen, die Sie verwenden müssen, die Apache Felix SCR-plugin. Sobald dies funktioniert, ist Ihr Dienst instanziiert werden.
Dann haben Sie, um auf den Dienst zugreifen. Der einfachste Weg, in der Schlinge, die Sie scheinen zu verwenden, ist SlingScriptHelper.getService() können Sie lookup-service.
Update
In OSGI services registriert sind, durch deren Art. Wenn Sie erklären, einen Dienst mit @Service(MyClass.class), wird der Dienst eingetragen unter den Typ MyClass. Abrufen, würden Sie die Abfrage der service-Registrierung für einen service des entsprechenden Typs. In den Java-code, würden Sie entweder getServiceReference(Class clazz)/getService(ServiceReference reference) die @Referenz annotation.
In einer JSP auf eine Schleuder-system können Sie das SlingScriptHelper, wie weiter oben beschrieben. Hier ein kurzes code-Beispiel (unter der Annahme korrekt importiert):
Wenn Sie zur Arbeit gehen, mehr mit OSGI, ich empfehle das OSGI-Spezifikation. Der download ist kostenlos und erklärt alles sehr ausführlich.
ilikeorangutans ist richtig, dass Sie nicht wollen, eine statische Methode auf die OSGi-service - die Idee ist, dass ein Dienst eine Schnittstelle implementiert, die clients rufen Sie es aus Ihrer OSGi-Kontext, und verwenden Sie es über seine service-Schnittstelle.
Den Apache Sling webloader Probe diese Technik verwendet, um Zugang zu einem Webloader service in Ihrer Anfrage Bearbeitung-Skripte. Die Skripte sind ESP in diesem Fall (server-side javascript), aber das Prinzip ist genau das gleiche mit JSP.
Wird die service-Schnittstelle definiert in Webloader.java, und WebLoaderImpl.java implementiert es als OSGi-service.
Dann, die html-Code.esp Skript ruft den Dienst mit Schlinge.getService:
Ändern Sie diese Zeile:-
welcome_message = PropertiesUtil.toString(ctx.getProperties().get(welcome_message), welcome_message);
zu
welcome_message = PropertiesUtil.toString(ctx.getProperties().get("welcome.message"), welcome_message);
den Unterschied bemerken :-ctx.getProperties().bekommen(welcome_message) vs ctx.getProperties().bekommen("willkommen.Meldung")