Это может произойти, когда #{service}
фактически разрешается в null
.
Когда вы используете @ManagedBean
без атрибута name
, как вы это делали, имя управляемого компонента по умолчанию будет преобразовано в имя класса.с 1-ым символом в нижнем регистре (по крайней мере, соответствуйте спецификации Javabeans), так что ваш MyService
бин будет эффективно получать имя управляемого бина myService
.
Таким образом, существует в основном 2 способа решения этой проблемы,
Используйте взамен #{myService}
.
@ManagedProperty("#{myService}")
private MyService service;
Укажите имя управляемого компонента, чтобы оно стало доступным как #{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;