Метод @PostConstruct не вызывается

Я хотел использовать @PostConstruct для инициализации bean-компонента в своем веб-приложении, но не могу заставить его работать.

Я воссоздал проблему в новом проекте, и она все равно не будет работать.

Я пропустил что-то очевидное здесь? Насколько я могу судить, мой метод init() соответствует всем требованиям, перечисленным в справочнике по API @PostConstruct.

MyBean.java:

@ManagedBean
@RequestScoped
public class MyBean {
    @ManagedProperty(value="15")
    private int number = 10;

    @PostConstruct
    public void init(){
        number = 20;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }
}

number.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">

<h:head>
    <title>Simple JSF Facelets page</title>
</h:head>

<h:body>
    Number = #{myBean.number}
</h:body>

</html>

Я ожидал Number = 20, но получил Number = 15.


person ddx    schedule 23.01.2014    source источник
comment
Это должно работать. Какой сервер вы используете? Какая версия JSF? Вы можете добавить оператор печати в свой метод init(), чтобы узнать, вызывается ли он.   -  person unwichtich    schedule 24.01.2014
comment
Я использую Glassfish 3.1.2 с Mojarra 2.1.6 (SNAPSHOT 20111206)   -  person ddx    schedule 24.01.2014
comment
Странный. Кажется, что @ManagedProperty распознается, а @PostConstruct — нет. Действительно странно.   -  person edubriguenti    schedule 24.01.2014
comment
SNAPSHOT может быть проблемой. Возможно, вы захотите избежать его использования и перейти к последней версии. Mojarra 2.2.5 (или api, impl) доступен сегодня.   -  person Tiny    schedule 24.01.2014
comment
Это действительно ошибка. Вам следует избегать моментальных снимков. Кстати, доступны GlassFish 4 и, как упоминалось выше, Mojarra 2.2+.   -  person    schedule 24.01.2014


Ответы (2)



По умолчанию Spring не будет знать об аннотациях @PostConstruct и @PreDestroy. Чтобы включить его, вы должны либо зарегистрировать CommonAnnotationBeanPostProcessor, либо указать <context:annotation-config /> в файле конфигурации компонента.

person Anthed    schedule 23.01.2014
comment
Есть ли разница, если вы замените аннотацию класса ManagedBean на Named? - person Anthed; 24.01.2014
comment
Интересные вещи можно прочитать здесь: palkonyves.blogspot. фр/2012/12/ - person Anthed; 24.01.2014