JSF 2.0 @ManagedProperty не установлен - PullRequest
2 голосов
/ 22 июля 2011

Я только начинаю использовать JSF и не понимаю, почему мой сервис не внедряется в мой контроллер.

@ManagedBean
@ApplicationScoped
public class MyController {

    @ManagedProperty(value = "#{service}")
    private MyService service;

    public void setService(MyService service) {
        this.service = service;
    }

    public MyService getService() {
        return service;
    }

    public void callToService(AjaxBehaviorEvent event) {
        System.out.println(service);
    }

}

В: Какова цель значения в @ManagedProperty?

@ManagedBean
@ApplicationScoped
public class MyService {

}

Нажатие на кнопку вызывает метод callToService, но услуга null.

<h:form>
        <h:commandButton value="Call Service">
            <f:ajax listener="#{myController.callToService}"/>
        </h:commandButton>
</h:form>

1 Ответ

4 голосов
/ 22 июля 2011

Это может произойти, когда #{service} фактически разрешается в null.

Когда вы используете @ManagedBean без атрибута name, как вы это делали, имя управляемого компонента по умолчанию будет преобразовано в имя класса.с 1-ым символом в нижнем регистре (по крайней мере, соответствуйте спецификации Javabeans), так что ваш MyService бин будет эффективно получать имя управляемого бина myService.

Таким образом, существует в основном 2 способа решения этой проблемы,

  1. Используйте взамен #{myService}.

    @ManagedProperty("#{myService}")
    private MyService service;
    
  2. Укажите имя управляемого компонента, чтобы оно стало доступным как #{service}.

    @ManagedBean(name="service")
    @ApplicationScoped
    public class MyService {
    
    }
    

Не связано с конкретной проблемой, так как вас, кажется, не интересует событие ajax, а скорее событие action, тогдавы также можете упростить использование <f:ajax> следующим образом:

<h:commandButton value="Call Service" action="#{myController.callToService}">
    <f:ajax />
</h:commandButton>

с помощью

public void callToService() {
    System.out.println(service);
}

, чтобы он продолжал работать, когда у конечного пользователя не включен JS.

Наконец, бизнес-сервис обычно проектируется как @Stateless EJB, а не как управляемый компонент JSF.поскольку он не должен иметь прямой связи с представлением JSF.Вы можете просто использовать

@EJB
private MyService service;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...