Здравствуйте!
Во время разработки JSF-приложения для Liferay 7.2 я столкнулся со следующей задачей: при инициализации бина вызвать какой-то *ServiceUtil
для получения списка всех организаций. Не долго думая, я написал примерно следующий код:
@ManagedBean
@ViewScoped
public class ContractorsListBean implements Serializable {
private Organization viewOrganization;
@PostConstruct
public void init() throws PortalException {
viewOrganization = OrganizationLocalServiceUtil.getOrganization(1);
}
}
Но при запуске этого приложения я столкнулся со странным поведением: бин создаётся, его свойства на facelet-странице получаются, но при этом, видимо, метод, помеченный аннотацией @PostConstruct,
не вызывается. Я уже начал было сетовать на то, что Liferay опять не логирует возникающие в приложении исключения (о решении этой проблемы я уже писал), потому я добавил несколько записей в лог в разных местах приложения: до вызова OrganizationLocalServiceUtil
, после него, потом в некоторых get-методах бина. И я получил странный результат: в get-методах запись в лог срабатывала, а в @PostConstruct
- нет. Очевидно, что @PostConstruct
не вызывался вовсе.
Данная проблема была решена легко - необходимо было просто обработать исключение внутри метода (или обернуть его в unchecked exception, или любым другим образом избавиться от исключения в сигнатуре метода). Таким образом, код приобрёл примерно следующий вид:
@ManagedBean
@ViewScoped
public class ContractorsListBean implements Serializable {
private Organization viewOrganization;
@PostConstruct
public void init() {
try {
viewOrganization = OrganizationLocalServiceUtil.getOrganization(1);
} catch (PortalException e) {
LogFactoryUtil.getLog(this.getClass()).warn("Error while fetch organization " + e.getMessage());
}
}
}
и @PostConstruct
стал успешно вызываться.
Засим откланиваюсь, прощайте.