【问题标题】:Websphere Portal Server Virtual Portal IBM Portal APIWebsphere Portal Server 虚拟门户 IBM Portal API
【发布时间】:2017-09-28 09:49:27
【问题描述】:

我正在使用 IBM Portal API 在 Websphere Portal Server 中开发一些页面,但我想在嵌套在我的主门户中的虚拟门户的上下文中工作。我已经阅读了 IBM 的文档,但我不明白它是如何工作的,所以我决定问问你们。你们中有人已经这样做了吗? 这就是我尝试从我的虚拟门户获取 ContentNode 的方式:

private void createPortalContent(HttpServletRequest request, HttpServletResponse response) throws InterruptedException, ModelException{
    Context ctx = null;
    try {
        ctx = new InitialContext();

        portletModelHome = (PortletModelHome) ctx.lookup(PortletModelHome.JNDI_NAME);
        if(portletModelHome == null){
            Thread.sleep(5000);
            portletModelHome = (PortletModelHome) ctx.lookup(PortletModelHome.JNDI_NAME);
        }

        contentModelHome = (ContentModelHome) ctx.lookup(ContentModelHome.JNDI_NAME);
        if(contentModelHome == null){
            Thread.sleep(5000);
            contentModelHome = (ContentModelHome) ctx.lookup(ContentModelHome.JNDI_NAME);
        }

        contentModelControllerHome = (ContentModelControllerHome) ctx.lookup(ContentModelControllerHome.JNDI_NAME);
        if(contentModelControllerHome == null){
            Thread.sleep(5000);
            contentModelControllerHome = (ContentModelControllerHome) ctx.lookup(ContentModelControllerHome.JNDI_NAME);
        }

        contentMappingInfoHome = (ContentMappingInfoHome) ctx.lookup(ContentMappingInfoHome.JNDI_NAME);
        if(contentMappingInfoHome == null){
            Thread.sleep(5000);
            contentMappingInfoHome = (ContentMappingInfoHome) ctx.lookup(ContentMappingInfoHome.JNDI_NAME);
        }

        virtualPortalList = (VirtualPortalListHome) ctx.lookup(VirtualPortalListHome.VIRTUAL_PORTAL_LIST_JNDI_NAME);
    } catch (NamingException e) {
        e.printStackTrace();
    }

    ContentModelController contentModelController = getController(request, response);
    //LOGGER.info("### CONTENT MODEL CONTROLLER: " + contentModelController.getLocator() + " " + contentModelController.getRoot().toString());
    ContentNode contentNode = (ContentNode) contentModelController.getLocator().findByUniqueName("ro.ram.comunicate");
    //LOGGER.info("### CONTENT NODE: " + contentNode);
   // LOGGER.info("#### VIRTUAL PORTAL LIST: " + virtualPortalList);

    //VirtualPortal virtualPortal = virtualPortalList.getVirtualPortalListProvider().getVirtualPortalList().getLocator().findByUniqueName("");
   // LOGGER.info("### VIRTUAL PORTAL: " + virtualPortal.getTitle(Locale.ENGLISH));
    //Iterator<VirtualPortal> it=virtualPortalList.getVirtualPortalListProvider().getVirtualPortalList().iterator();
   // while(it.hasNext()){
   //     LOGGER.info("### VIRTUAL PORTAL LIST ITERATOR: " + it.next().getDescription(Locale.ENGLISH) + " " + " " + it.next().getTitle(Locale.ENGLISH));
  //      it.next();
    //}
}

谢谢,

【问题讨论】:

  • 您使用的是什么特定的 Portal API?
  • 我正在使用包含名为 com.ibm.portal.* 的包的门户 API。 jar 是 wp.base.jar、wp.model.api.jar 等。
  • 模型 api 非常大,但是如果您在 portlet 的范围内运行代码,它应该已经是范围内的,就像您使用模型 api 来检查内容模型一样已经限定在当前 VP 范围内。现在,如果您尝试在 VP 范围之外的 servlet 中运行它,例如尝试创建链接或类似的东西,您必须使用 objectids 等来查找页面等等。并且只有模型的一部分是 VP 范围的,就像 portlet 模型是跨 vps 一样。我们需要更多关于您想要做什么的详细信息
  • 您好!我正在尝试在虚拟门户中创建一些门户页面,但我正在将应用程序运行到 Websphere Application Server 上的 servlet 上下文中。主要是,我无法访问虚拟门户上下文,因为我正在尝试使用该页面的 objectId 获取门户页面模板并且我正在获取 NullPointer。我在帖子中放了一些代码以获取更多详细信息。

标签: java api websphere-portal


【解决方案1】:

所以寻找唯一名称是个坏主意,在门户范围之外工作时必须寻找页面的 objectid。来自信息中心的这条评论 " 虚拟门户的概念将一些模型限定为用户在其中操作的虚拟门户。目前,此范围概念适用于内容模型、导航模型和导航选择模型。这些模型将其资源限定为虚拟用户操作的门户。” 我认为您最好将这段代码移到 portlet 的资源请求中,然后通过它进行更新,使其具有范围。如果您想继续沿着这条路走下去,请在使用 Identification 包将 objectid 的字符串表示形式转换为实际对象之后,使代码不查找唯一名称而是查找实际对象 id,然后在其上使用定位器

【讨论】:

  • 我想我不明白你,但我的问题是我可以在虚拟门户的上下文中运行应用程序/servlet。我看不到放置在虚拟门户中的对象,而只能看到主门户中的对象。更准确地说,我已经使用 IBM WCM API 在 WCM for Virtual Portal 中创建内容项,但我通过实现 VirtualPortalScopedAction 和覆盖 run 方法来使用该门户的上下文。现在,IBM API 和 IBM SPI 没有为我提供类似的东西。谢谢!
【解决方案2】:

对于想要做类似事情的每个人,解决方案(这是给我的)可能是:

  1. 使用 IBM WCM API 创建一个实现 VirtualPortalScopedAction 的类。在此类中,您必须重写 run 方法。这个接口的实现是必要的。
  2. 在运行方法中,您可以完成所有数学运算。在这里,您必须实例化 IBM Portal API 和 SPI 公开的对象(ContentModelController、ContentModelHome、ContentModelControllerHome)。所有这些都是在 IBM Websphere Portal 中进行操作所必需的。
  3. 在实现 VirtualPortalScopedAction 的类中,您必须传递 HttpServletRequest 和 HttpServletResponse,因为实例化所有这些对象都会使用请求和响应。为此,很明显您在该类中声明了两个属性并使用 setter 设置请求和响应的实例。

谢谢大家 :) 我希望这会对你有所帮助!

【讨论】:

  • 这拯救了我的一天。有很多论坛条目说它根本不起作用,但是这个解决方案非常有效
  • 我知道,当我第一次遇到这个问题时,我已经失去了大约 1 周的时间,直到这个想法拯救了我:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
相关资源
最近更新 更多