2016-07-15 21 views
2

Ich benutze ein Sling-Servlet. Darin verwende ich javax.jcr.Session als Referenz. Nach einem Build-Einnahme und wenn ich in System/console/Komponenten zu sehen, ich sehe den folgenden Fehler@Referenz Sitzung zeigt nicht zufriedengestellten Fehler

Referenz Sitzung [ "Unbefriedigend", "Service Name: javax.jcr.Session", "Cardinality : 1..1" , "Politik: statisch", "Policy Option: zurückhaltend", "Nein Service gebunden"]

Wie kann ich dieses Problem lösen?

Antwort

4

javx.jcr.Session ist keine Servicekomponente, daher können Sie nicht darauf verweisen (siehe http://felix.apache.org/documentation/subprojects/apache-felix-maven-scr-plugin/scr-annotations.html#reference) mit @Reference.

Wenn Sie die aktuelle Benutzersitzung benötigen, können Sie es aus dem SlingHttpServletRequest Objekt wie folgt extrahieren:

Session session = slingHttpServletRequest.getResourceResolver() 
        .adaptTo(Session.class); 

Wenn Sie die Sitzung eines anderen Benutzers müssen (einen technischen Benutzer mit „besser“ Rechten vielleicht) , könnten Sie den ResourceResolverFactory verwenden, der ein Dienst ist, auf den verwiesen werden kann.

3

javax.jcr.Session ist kein Service und kann daher nicht mit @Reference Annotation injiziert werden.

der Sitzung erhalten Sie folgendes tun könnte -

In AEM 6.x, sind Sie annehmen, Code wie folgt zu verwenden.

/** 
* Gets the service resource resolver. 
* 
* @return resourceResolver. 
* @throws LoginException - exception if unable to login to repo. 
*/ 
public static ResourceResolver getServiceResourceResolver(ResourceResolverFactory resourceResolverFactory) throws LoginException { 
    final Map<String, Object> authParam = new HashMap(); 
    authParam.put(ResourceResolverFactory.SUBSERVICE, APPLICATION_READER_SUBSERVICE.value()); 

    return resourceResolverFactory.getServiceResourceResolver(authParam); 
} 

Sie here von Beispielimplementierung des obigen Ansatz verweisen könnte

+0

Warum er eine Dienstressource Resolver in einem Servlet bekommen sollte? Das Antwortobjekt verfügt über einen eigenen sitzungsgebundenen Ressourcenlöser, und Sie können die Sitzung direkt daraus extrahieren. –

+0

Wahr, für die meisten Anwendungsfälle könnte der Resource Resolver aus der Anfrage verwendet werden, um eine Sitzung in einem Servlet zu erhalten. Meine Ansicht ist, dass für alles, was nicht erfordert Knoten Manipulation bei der Veröffentlichung kann ohne eine Sitzung mit Sling API erfolgen. Die Sitzung, die Sie veröffentlichen werden, hat die Rechte eines anonymen Benutzers und hat keine Schreibrechte darauf. Wenn also eine Sitzung für CRUD oder Workflow-Trigger benötigt wird, ist es am besten, die Sitzung von Resource Resolver aus Anfrage –

+0

@AmeeshTrikha nicht zu verwenden. Ich halte dies für eine schlechte Vorgehensweise und erschließt Schwachstellen. Bei einem Veröffentlichungszugriff handelt es sich normalerweise um einen anonymen Vorgang, der niemals Schreibzugriff haben sollte. Bei einem Autor wird der Benutzer authentifiziert, und wenn seine Berechtigungen es ihm nicht erlauben, in einem bestimmten Bereich zu schreiben, sollte dies nicht außer Kraft gesetzt werden. Administrative oder technische Benutzersitzungen sind nur in geplanten Jobs und Ereignis-Listenern sinnvoll. – Thomas