2013-07-01 4 views
1

Этот вопрос, вероятно, был answred на SO уже но я не смог заставить его работать сам ...Liferay портлета и относительный путь

У меня есть Liferay портлета, и я пытаюсь прочитать некоторые config.xml файл, когда это инициализировать портлет (повторно развернут). Тем не менее, я не могу найти относительный (или абсолютный) путь к портлету из Java ... This question был близок к проблеме, которую я решаю, но URL-адрес больше не работает ...

Когда я звоню

String path = getPortletContext().getRealPath("someDirectoryExample"); 

в методе ПОСЛЕ проблемы была инициализации, она работает, но я хотел бы сделать это внутри конструктора портлетов (= во время инициализации фазы). Это, однако, конец этой чрезвычайно длинной полосой исключение:

09:43:43,905 INFO [STDOUT] Caused by: java.lang.IllegalStateException: Config is null, please ensure that your init(config) method calls super.init(config) 

09:43:43,905 INFO [STDOUT]  at javax.portlet.GenericPortlet.getPortletContext(GenericPortlet.java:463) 

09:43:43,905 INFO [STDOUT]  at com.logic.PortletVisual.<init>(PortletVisual.java:23) 

09:43:43,905 INFO [STDOUT]  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
... 

Было бы совершенно нормально, если бы я мог просто поместить файл XML где-то в DOCROOT или любой другой каталог и использовать относительный путь, но класс Java сделал не найти файл, даже если я скопировал его везде ... (путь по умолчанию - это каталог bin на сервере - JBossAS, но я хотел бы сохранить этот файл в моих каталогах portelt).

Спасибо за любые советы!

EDIT: Не путайте исключения. Все работает нормально, когда я не пытаюсь вызвать функцию getRealPath() в конструкторе!

ответ

2

Прежде всего, «Конструктор портлетов» не «= фаза инициализации», init() - это «фаза инициализации».

Кроме того, имейте в виду, что никто не гарантирует, что getRealPath фактически возвращает значимое значение - см. its javadoc. Сообщение, которое вы даете в исключении, предполагает, что ваш код init() должен сначала вызвать super.init(), а затем предположить, что инфраструктура действительно установила portletContext.

+0

Достаточно справедливо, спасибо за то, что это яснее для меня. Однако существует ли способ доступа к ресурсам (например, XML-файлам) в конструкторе портлета? Если да, то как это сделать? Если нет, есть ли альтернатива? Это то, что беспокоит меня больше всего, и я не нашел никаких учебных пособий по этому поводу ... Кроме того, это исключение возникает только при попытке получить путь в конструкторе, все остальное работает нормально! – Smajl

+2

Почему это обязательное пройти через все виды обручей, чтобы сделать это в конструкторе? В документации жизненного цикла четко указано, что init() будет вызываться перед любым другим значимым действием. Вы используете фреймворк - используйте этот режим работы по умолчанию. Это сделает вашу жизнь намного проще, но что более важно: она сделает жизнь каждого будущего помощника намного проще, если они смогут просто сформулировать стандартные предположения для рамки и предположить, что они соблюдаются. –

+0

Вы правы, я совершенно новый для всего этого «портлета» :-) Я постараюсь сделать это в функции init(). Вы знаете, есть ли какой-то эквивалент getRealPath(), который будет лучше работать для моей проблемы? – Smajl

Смежные вопросы