3

我在我的 liferay 门户 6 中使用自定义 porltet。我有一些全局变量,我想在我的 portlet 类中使用,因此我在 portlet.xml 文件中编写了该变量,如下所示..

<init-param>
        <name>Host</name>
        <value>smtp.mail.yahoo.com</value>
</init-param>

<init-param>
        <name>Port</name>
        <value>465</value>
</init-param>

在我的 portlet 操作类中完美运行的功能

publicList<String> ReadSmtpDataForMailNotification() {

        List<String> ValuesListObj = new ArrayList<String>();
        ValuesListObj.add(this.getInitParameter("Host"));
        ValuesListObj.add(this.getInitParameter("Port"));
        return ValuesListObj;
    }

现在的问题是,当我使用 portlet 操作类执行函数时,它的工作很完美,但是当我想在我的 portlet 类之外访问这个变量时......例如:- 在我的本地服务 impl 类中,我无法访问该变量和值come 始终为 null ..所以请如果有人可以建议我如何在其他 portlet 类中获取 initparam 的值。

@Advaita Gosvami

在 portlet.properties 文件中写了 my.custom.host=liferay.css.com

当我尝试使用以下内容获取价值时

 System.out.println("Property value : - " + PropsUtil.get("my.custom.host"));

它给了我空值..

4

3 回答 3

3

中的变量<init-param>旨在由 portlet 本身访问,而不是由任何其他类访问。这些参数不适用于所有其他类。

因此,如果您想访问其他类中的参数,而不是将参数作为参数从 portlet 类传递给类的方法(这里是本地服务实现)。

我建议的另一种方法是将这些参数放在portal-ext.properties文件中,例如:

my.custom.host=smtp.mail.yahoo.com
my.custom.port=465

然后使用PropsUtil. 通过这种方法,这些属性将可供该门户的所有 portlet 使用。

您也可以将上述值放入portlet.properties并可以通过PortletPropscase 访问。使用这种方法,它将仅可用于单个 portlet。

或者你甚至可以尝试在一个常量类中包含这些参数,例如:

interface MyConstants {
    String HOST = "smtp.mail.yahoo.com";
    String PORT = "465";
}

如果您只希望它用于一个 portlet,那么第二种方式将是最好的。

我建议考虑一下为什么在<init-param>.

于 2013-01-31T06:02:04.273 回答
3

抽象的 :

如果您想在运行时获取 portlet 的 init-params,您可以使用 yourcom.liferay.portal.service.PortletLocalServiceUtil来获取您的 portlet。

然后你得到一个com.liferay.portal.model.Portlet.

这是一个非常方便的对象,因为它为您提供了调用方便方法的可能性:

public java.util.Map<java.lang.String, java.lang.String> getInitParams();

代码片段:

在 portlet 中,一个运行在 liferay 服务器上的 servlet,一个在服务器启动时运行的钩子,一个quartz-job,一个服务......

可以调用下面的代码来获取一个portlet的init-param map

import com.liferay.portal.model.Portlet;
import com.liferay.portal.service.PortletLocalServiceUtil;
import java.lang.String;
import java.util.Map;

...

/* Determine what is your portlet's id, you can go as follows or find it after placing one in a page and check it's id with a tool like firebug */
String myPortletId = "myPortletName_WAR_myPortletWar";

/* Get the actual portlet model object with the appropriate service call */
Portlet myPortletObject PortletLocalServiceUtil.getPortletById(myPortletId);

/* Get the map of init-params from the portlet model object */
Map<String,String> initParamMap = myPortletObject.getInitParams();

/* You can now iterate on your map as on any other */
for (String currentParamKey : initParamMap.keySet()) {
    String currentParamValue = initParamMap.get(currentParamKey);
    /* do stuff */
}

幕后原则:

在 Liferay 中,需要注册一个 portlet 才能使用。
部署后,门户会注册它,注册它init-params一堆其他信息

最幸运的是,Liferay 将因此将所有这些数据存储在它的数据库中。
就像 Liferay 存储在数据库中的几乎所有信息一样,这些信息可以通过LiferayService访问。

这些服务附带了一堆实用方法。

  • 一些,非常基础的(比如高级的crud
  • 一些更具体到当前服务。

在我的代码示例中,我得到了我的 portlet 对象,这要归功于一种搜索 portlet 的方法portletId。这portletId不是表的数据库主键Portlet
因此,Liferay 自己的业务是关联portletId实际上是名称),而不是强行询问主键,这是一个无意义的数字long

您可以使用其他方法来获取您的 portlet 的对象,因为 PortletLocalServiceUtil 有许多可用的查找器。
我强烈建议您$LIFERAY_PORTAL_SRC/portal-service/src/com/liferay/portal/service/PortletLocalServiceUtil.java在任何提供“大纲”视图的 IDE 中检查该文件,以更好地了解它的所有可能性。

结论 :

希望这可以帮助 ;)

于 2013-02-04T10:06:10.053 回答
0

无论如何,正如@Advaita Gosvami 之前所说的那样,我已经完成了 portlet.properties 中的更改,但有些方法不适用于我的自定义密钥...

mail.session.mail.smtps.auth=true
mail.session.mail.smtps.host=smtp.gmail.com
mail­.session.mail.smtps.password=***********(your password here)
mail.session.mail.smtps.port=465
mail.session.mail.s­mtps.user=liferay.test@gmail.com(your emailId Here)
mail.session.mail.transport.protocol=smtp

我用它来称呼它

PortletProps.get("mail.session.mail.smtps.host");

它给了我在自定义 portlet 中调用的任何地方的完美价值

感谢@Advaita Gosvami 为您提供有价值的帮助。以防万一您在portlet 属性中贴上自定义键给我空值。但是正如我上面在portlet 属性中提到的那样,我可以访问这些键...thnx 很多

于 2013-02-05T09:13:14.200 回答