angle-left

Не вызывается @PostConstruct у JSF-бинов

Здравствуйте!

Во время разработки 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 стал успешно вызываться.
 

Засим откланиваюсь, прощайте.