AEM 6.3 - 将Felix迁移到OSGi注释:如何处理propertyPrivate?

时间:2017-08-04 14:37:31

标签: spring annotations osgi aem apache-felix

我将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注释有关吗?

谢谢你,最诚挚的问候!

2 个答案:

答案 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");
  }
}

来源:https://github.com/heervisscher/htl-examples/blob/master/core/src/main/java/com/adobe/examples/htl/core/servlets/SimpleServlet.java