在我的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
答案 0 :(得分:6)
您应该能够将ResourceResolverFactory实例注入到组件/服务中,并从那里解析资源/页面,如Getting Resources and Properties in 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);
}
}
这使用管理登录,即not ideal。我建议使用请求中的ResourceResolver。最简单的方法是将它作为方法参数传递给组件/ servlet中的getSpecificPage(resourceResolver)
(上面)。
<强>更新强> 在更新版本的Sling(大约2014年,AEM6 +)中执行此操作的正确方法是使用Sling Service Authentication。现在不推荐使用getAdministrativeResourceResolver方法。
答案 1 :(得分: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);
}
}
这取决于您在此捆绑中的设置。
答案 2 :(得分:1)
无法实例化PageManager。要获取实例,您可以调整资源解析器: resourceResolver.adaptTo(PageManager.class)。
通常可以从资源获取resourceResolver: resource.getResourceResolver(),您也可以直接从吊索请求中获取它