我将AEM 6.1应用程序迁移到AEM 6.3。由于不推荐使用Felix注释(org.apache.felix.scr.annotations。*),我决定将我的组件迁移到OSGi注释(org.osgi.service.component.annotations。*)。
一旦我弄清楚它是如何工作的,这很容易。但有一个案例我不知道如何处理: propertyPriavte = true 的属性。
旧的实现如下:
@Component(metatype = true)
@Service(Servlet.class)
@Properties({
@Property(name = "sling.servlet.selectors", value = "overlay", propertyPrivate = true),
})
public class OverlayServletImpl extends OverlayServlet {
...
}
属性 sling.servlet.selectors 在AEM控制台的配置管理器中无法配置,但由于配置文件可配置,对吧?所以,我仍然需要定义这个属性。
对于其他属性,我改变了我的实现:
// OverlayServletImpl
@Component(
service = Servlet.class,
configurationPid = "my.package.path.OverlayServletImpl"
)
@Designate(
ocd = OverlayServletImplConfiguration.class
)
public class OverlayServletImpl extends OverlayServlet {
...
}
// Configuration
@ObjectClassDefinition(name = "Overlay Servlet")
public @interface OverlayServletImplConfiguration {
String sling_servlet_selectors() default "overlay";
...
}
现在,我有属性 sling.servlet.selectors ,但它也可以在Configuration Manager中使用,并且可以在那里更改它的值。但我不想要那个。
我该怎么做?这可能与OSGi注释有关吗?
谢谢你,最诚挚的问候!
答案 0 :(得分:0)
据我所知,这是不可能的。您定义的每个属性都可以被config覆盖。
答案 1 :(得分:0)
如果您使用@Component
注释来指定私有属性,则可能会出现这种情况。
@Component(service = Servlet.class,
property =
{ SLING_SERVLET_RESOURCE_TYPES + "=aemhtlexamples/structure/page",
SLING_SERVLET_METHODS + "=GET",
SLING_SERVLET_EXTENSIONS + "=html",
SLING_SERVLET_SELECTORS + "=hello" })
public class SimpleServlet extends SlingSafeMethodsServlet {
@Override
protected void doGet(final SlingHttpServletRequest req, final SlingHttpServletResponse resp)
throws ServletException, IOException {
final Resource resource = req.getResource();
resp.getOutputStream().println(resource.toString());
resp.getOutputStream().println("This content is generated by the SimpleServlet");
}
}