Как получить параметр инициализации portlet.xml в Liferay?
Я использую пользовательский porltet в моем портале liferay 6. У меня есть глобальная переменная, которую я хочу использовать в своих классах портлетов, поэтому я записал эту переменную в файл 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>
функция, которая прекрасно работает в моем классе действий портлета
publicList<String> ReadSmtpDataForMailNotification() {
List<String> ValuesListObj = new ArrayList<String>();
ValuesListObj.add(this.getInitParameter("Host"));
ValuesListObj.add(this.getInitParameter("Port"));
return ValuesListObj;
}
Теперь проблема в том, что когда я извиняю функцию с классом действия портлета, она работает идеально, но когда я хочу получить доступ к этой переменной за пределами моего класса портлета. Например:- в моем классе impl локальной службы, тогда я не могу получить доступ к этой переменной и значению come всегда null.. поэтому, пожалуйста, если кто-нибудь может подсказать мне, как я могу получить значение initparam в другом, чем класс портлета.
@ Адвайта Госвами
записали my.custom.host=liferay.css.com в файл portlet.properties
и когда я пытаюсь получить значение с помощью следующего
System.out.println("Property value : - " + PropsUtil.get("my.custom.host"));
это дает мне нулевое значение..
3 ответа
В любом случае, я сделал это, как сказал @Advaita Госвами ранее, с изменениями в 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.smtps.user=liferay.test@gmail.com(your emailId Here)
mail.session.mail.transport.protocol=smtp
и я звоню с
PortletProps.get("mail.session.mail.smtps.host");
это дало мне идеальную ценность из любого места, где я звоню в своем портлете
Спасибо @Advaita Госвами за вашу полезную помощь. Только в случае, если вы измените пользовательский ключ в свойствах портлета, предоставив мне нулевое значение. Но с этими ключами, как я уже упоминал выше в свойствах портлета, я могу получить доступ... спасибо много
Аннотация:
Если вы хотите получить init-параметры портлета во время выполнения, вы можете использовать com.liferay.portal.service.PortletLocalServiceUtil
чтобы получить ваш портлет.
Тогда вы получите экземпляр com.liferay.portal.model.Portlet
,
Это очень удобный объект, поскольку он дает вам возможность вызвать удобный метод:
public java.util.Map<java.lang.String, java.lang.String> getInitParams();
Фрагменты кода:
В портлете, сервлет, работающий на вашем сервере LifeRay, ловушка, запускаемая при запуске сервера, кварцевое задание, служба...
Может вызвать следующий код для получения карты init-param портлета
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 портлет должен быть зарегистрирован, чтобы его можно было использовать.
При развертывании портал регистрирует его, регистрирует его init-params
и куча другой информации.
Самым удачным в этом факте является то, что Liferay, таким образом, будет хранить все эти данные в своей базе данных.
Как и почти вся информация, которую Liferay хранит в базе данных, эта информация доступна через LiferayService.
Эти сервисы поставляются с кучей служебных методов.
- Некоторые, очень простые (например, продвинутый crud)
- Некоторые более специфичны для текущего сервиса.
В моем примере кода я получил свой объект портлета благодаря методу, который ищет портлеты portletId
, это portletId
не является первичным ключом базы данных таблицы Portlet
,
Следовательно, Liferay занимается своим делом, связывая portletId
(на самом деле это имя) вместо принудительного запроса первичного ключа, который является бессмысленным числовым long
,
Вы можете использовать другие методы для получения объекта вашего портлета, так как PortletLocalServiceUtil имеет много доступных средств поиска.
Я настоятельно рекомендую вам проверить файл $LIFERAY_PORTAL_SRC/portal-service/src/com/liferay/portal/service/PortletLocalServiceUtil.java
в любой IDE, которая предлагает "контурный" вид, чтобы получить лучшее представление обо всех его возможностях.
Заключение:
Надеюсь это поможет;)
Переменные в <init-param>
предназначены для доступа к самому портлету, а не для любого другого класса. Эти параметры не для всех других классов.
Поэтому, если вы хотите получить доступ к параметрам в других классах, а не передавать параметры в качестве аргументов методу класса (здесь подразумевается локальная служба) из класса портлета.
Другой способ, который я хотел бы предложить, это иметь эти параметры в portal-ext.properties
файл как:
my.custom.host=smtp.mail.yahoo.com
my.custom.port=465
А затем получить к нему доступ из этого файла, используя PropsUtil
, При таком подходе эти свойства будут доступны для всех портлетов этого портала.
Вы также можете поместить вышеуказанные значения в portlet.properties
и может получить доступ через PortletProps
дело. При таком подходе он будет доступен только для отдельного портлета.
Или вы можете даже попытаться использовать эти параметры внутри класса Constant, например:
interface MyConstants {
String HOST = "smtp.mail.yahoo.com";
String PORT = "465";
}
Этот второй способ будет лучшим, если вы хотите использовать его только для одного портлета.
Я бы посоветовал подумать, зачем вам эти параметры в <init-param>
,