gpt4 book ai didi

java - AEM 6.3 使用 OSGi R6 注释和 Sling 模型

转载 作者:行者123 更新时间:2023-12-02 12:09:44 26 4
gpt4 key购买 nike

我正在尝试使用 OSGi R6 注释创建 OSGi 服务,然后将其注入(inject)到 Sling Model 类中,如下所示:

   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;
}

}

OSGi配置界面如下所示:

    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";
}

服务类如下所示:

   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;
}
}

最后是服务接口(interface):

package com.aem.sites.services;

public interface WeatherService {

public String getName();

}

我正在尝试在 HTL 类中使用 Sling Model Pojo,如下所示:

<sly data-sly-use.banner="com.aem.sites.models.Banner">

<div class="inner">
<h2>${banner.message}</h2

</div>

</sly>

但我看不到任何文字。我已经使用了 logger.info,但也无法在日志文件中看到它。我确信我在这里做了一些非常错误的事情,但无法定位,因为我刚刚开始使用 OSGi R6 注释和 Sling 模型。如有任何帮助,我们将不胜感激。

添加 Maven 依赖项:

父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>

核心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>

最佳答案

在服务实现中,您输入的 service=WeatherServiceImpl.class 是不正确的,它应该是服务接口(interface)名称。

所以,在WeatherServiceImpl中改变

 @Component(service=WeatherServiceImpl.class,

 @Component(service=WeatherService.class,

..

编辑:另外,configurationPolicy=ConfigurationPolicy.REQUIRE 表示至少应该有一个配置才能激活 DS 组件。 (代码中的配置不起作用)

这样您就可以转到系统/system/console/configMgr/com.aem.sites.services.impl.WeatherServiceImpl 并输入值并保存。或者您可以将配置策略设置为可选,您的代码无需配置即可运行。

关于java - AEM 6.3 使用 OSGi R6 注释和 Sling 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46627213/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com