Ich versuche, einen OSGi Service mit OSGi R6 Anmerkungen zu erstellen und sie dann in der Schlinge Modellklasse wie diese Injektion:AEM 6.3 Verwendung OSGi R6 Anmerkungen und Sling Modelle
package com.aem.sites.models;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.models.annotations.Model;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.aem.sites.services.WeatherService;
@Model(adaptables=Resource.class)
public class Banner {
final static Logger logger = LoggerFactory.getLogger(Banner.class);
@Inject
private WeatherService weatherService;
private String message;
@PostConstruct
public void init() {
logger.info("##############################################################calling the init method");
message = weatherService.getName();
}
public String getMessage() {
logger.info("##############################################################inside the get message method");
return message;
}
}
Die OSGi-Konfigurationsschnittstelle wie folgt aussieht :
package com.aem.sites.interfaces;
import org.osgi.service.metatype.annotations.AttributeDefinition;
import org.osgi.service.metatype.annotations.AttributeType;
import org.osgi.service.metatype.annotations.ObjectClassDefinition;
@ObjectClassDefinition(name = "Configuration", description = "Configuration file")
public @interface Configuration {
@AttributeDefinition(
name = "String Property",
description = "Sample String property",
type = AttributeType.STRING
)
public String getText() default "It's a test";
}
und die Service-Klasse sieht wie folgt aus:
package com.aem.sites.services.impl;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.annotations.Modified;
import org.osgi.service.component.annotations.ConfigurationPolicy;
import org.osgi.service.metatype.annotations.Designate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.aem.sites.interfaces.Configuration;
import com.aem.sites.services.WeatherService;
@Component(service=WeatherService.class,
immediate=true,
configurationPid = "com.aem.sites.services.impl.WeatherServiceImpl",
configurationPolicy=ConfigurationPolicy.REQUIRE
)
@Designate(ocd = Configuration.class)
public class WeatherServiceImpl implements WeatherService{
final static Logger logger =LoggerFactory.getLogger(WeatherServiceImpl.class);
private Configuration config;
private String name;
@Activate
@Modified
protected final void activate(Configuration configuration) {
logger.info("##############################################################calling activate method inside the weather service impl class");
this.config = configuration;
name = config.getText();
}
@Deactivate
protected void deactivate() {
}
@Override
public String getName() {
logger.info("##############################################################calling get name method inside the weather service impl class");
return name;
}
}
und fin verbünden die Service-Schnittstelle:
package com.aem.sites.services;
public interface WeatherService {
public String getName();
}
Ich versuche, das Sling Modell Pojo in der HTL Klasse wie folgt zu verwenden:
<sly data-sly-use.banner="com.aem.sites.models.Banner">
<div class="inner">
<h2>${banner.message}</h2
</div>
</sly>
Aber ich bin nicht imstande, alle Texte zu sehen. Ich habe die logger.info verwendet, kann sie aber auch nicht in den Log-Dateien sehen. Ich bin mir sicher, dass ich hier etwas sehr falsch mache, aber nicht in der Lage zu lokalisieren, da ich gerade angefangen habe mit OSGi R6 Annotationen und Sling Models zu spielen. Jede Hilfe wird geschätzt.
Hinzufügen von Maven Abhängigkeiten:
Eltern pom.xml
<!-- <plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.5.3</version>
</plugin> -->
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>3.3.0</version>
<inherited>true</inherited>
</plugin>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.service.component.annotations</artifactId>
<version>1.3.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.annotation</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.service.metatype.annotations</artifactId>
<version>1.3.0</version>
</dependency>
Kern pom.xml
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.service.component.annotations</artifactId>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.annotation</artifactId>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.service.metatype.annotations</artifactId>
</dependency>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>com.aem.site.aem-site</Bundle-SymbolicName>
<Sling-Model-Packages>
com.aem.sites.models
</Sling-Model-Packages>
<Import-Package>javax.inject;version=0.0.0,*</Import-Package>
</instructions>
</configuration>
</plugin>
In Ihr Modell: Können Sie '@ Inject' durch' @OSGiService' ersetzen? In der offiziellen Dokumentation wurde das '@ Inject' für ein Modell verwendet, das von' SlingHttpServletRequest' adaptiert wurde. Sie passen sich von 'Resource' an. Dies könnte einen Unterschied machen, obwohl ich mir nicht 100% ig sicher bin. – Jens