4

在我的 OSGi 包中的 Java 类中,我有一个页面的 URI -

String pageUri = "/content/site/page.html" ;

如何使用此 URL 创建 Page 对象?我基本上还需要稍后从对象中获取页面属性......

我在课堂上尝试了这段代码:

PageManager pm = new PageManager();
Page page = pm.getPage(pageUri);

但这给了我编译错误:

Cannot instantiate the type PageManager
4

3 回答 3

6

您应该能够将 ResourceResolverFactory 实例注入到您的组件/服务中,并从那里解析 Resource/Page,如获取 Sling 中的资源和属性中所述。

例如:

@Component(immediate = true)
@Service(GetMeAPage.class)
public class GetMeAPage {

    @Reference
    private ResourceResolverFactory resourceResolverFactory;

    private static final String pageUri = "/content/site/page.html";

    /**
     * This method is executed at component startup rather than in the context of a request.
     */
    @Activate
    public void getSpecificPage() {
        ResourceResolver resourceResolver = null;
        try {
            resourceResolver = resourceResolverFactory.getAdministrativeResourceResolver(null);
            Page page = getSpecificPage(resourceResolver);
            System.out.println(page.getTitle());
        } catch (LoginException e) {
            e.printStackTrace();
        } finally {
            if (resourceResolver != null) {
                resourceResolver.close();
            }
        }
    }

    public Page getSpecificPage(ResourceResolver resourceResolver) {
        Resource resource = resourceResolver.resolve(pageUri);
        return resource.adaptTo(Page.class);

    }
}

此要点中的完整代码

这使用了一个不理想的管理登录。我建议使用请求中的 ResourceResolver。执行此操作的最简单方法是将其作为方法参数从您的组件/servlet 传递到(上方)。getSpecificPage(resourceResolver)

更新: 在较新版本的 Sling(大约 2014 年,AEM6+)中执行此操作的正确方法是使用Sling Service Authentication。getAdministrativeResourceResolver 方法现在已弃用。

于 2013-08-29T07:28:07.073 回答
2

如果通过“OSGi 包中的类”,您正在扩展SlingAllMethodsServlet,您将有权访问请求,您可以从中获取解析器/页面管理器。

class Foo extends SlingAllMethodsServlet {
    @Override
    protected void doGet(SlingHttpServletRequest request, 
                         SlingHttpServletResponse response) 
        throws javax.servlet.ServletException, java.io.IOException {

           ResourceResolver resourceResolver = request.getResourceResolver();
           PageManager pageManager = resourceResolver.adaptTo(PageManager.class);

           String pageUri = "/content/site/page.html" ;
           Page page = pageManager.getPage(pageUri);
    }
}

这取决于您在此捆绑包中的设置。

于 2013-08-29T08:11:26.567 回答
1

PageManager 不能被实例化。要获取实例,您可以调整资源解析器:resourceResolver.adaptTo(PageManager.class)。

resourceResolver 一般可以从资源中获取:resource.getResourceResolver(),也可以直接从sling请求中获取

于 2013-08-29T06:16:14.947 回答