Значение viewParam не установлено в ViewScoped bean
Извините, возможно, еще один действительно основной вопрос. В моем ViewScoped bean "viewParam" выглядит как набор, но когда я его использую, значение равно null. Я установил точку останова в setter (setEventId()), и он получает значение, но в методе, указанном моим preRenderView, он исчез, поэтому я не могу загрузить объект Event, который я пытаюсь извлечь.
Это работало нормально, когда мой bean был запрошен, но я обнаружил, что при POST и последующей ошибке проверки все мои данные были потеряны и прочитали, что ViewScoped - это способ обойти эту проблему.
Я обновился до Mojarra 2.1.7, потому что я думал, что это может быть ошибка, и действительно есть "критическая ошибка", указанная в их JIRA, исправленная в 2.1.7, но я проверил в журналах Glassfish, что это было используя новую версию, и у меня по-прежнему возникает одна и та же проблема: http://java.net/jira/browse/JAVASERVERFACES-2266
Пожалуйста, помогите, вот мой bean (я пробовал с аннотацией ManagedProperty и без нее)
@ViewScoped
@Named
public class EventController extends AbstractController {
private static final Logger logger = Logger.getLogger("EventController");
/**
* Request param managed property
*/
@ManagedProperty(value="#{param.eventId}")
private Long eventId;
private Event event = new Event();
/**
* The event dao
*/
@Inject
private EventDao eventDao;
/**
* Load the event (requires eventId has a value)
* @return
*/
public void loadEvent() {
event = eventDao.find(eventId);
}
/**
* @return the eventId
*/
public Long getEventId() {
return eventId;
}
/**
* @param eventId the eventId to set
*/
public void setEventId(Long eventId) {
this.eventId = eventId;
}
}
Здесь, как я создаю ссылку на странице 'listEvents'
<h:link value="Full details" outcome="/calendar/viewEvent" includeViewParams="true">
<f:param name="eventId" value="#{calendarController.event.eventId}" />
</h:link>
И вот страница, для которой требуется свойство eventId
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<body>
<ui:composition template="/WEB-INF/templates/standardTemplate.xhtml">
<f:metadata>
<f:viewParam name="eventId" value="#{eventController.eventId}"/>
<f:event type="preRenderView" listener="#{eventController.loadEvent}" />
</f:metadata>
<ui:define name="content">
<h1>Event details for: #{eventController.event.title}</h1>
<h:form>
<p:messages/>
<p:panelGrid style="margin-top:20px">
<f:facet name="header">
<p:row>
<p:column colspan="4">Event details</p:column>
</p:row>
</f:facet>
<p:row>
<p:column>
Title
</p:column>
<p:column colspan="3">
<p:inputText value="#{eventController.event.title}" size="49"/>
<h:inputHidden id="eventId" value="#{eventController.event.eventId}"/>
</p:column>
</p:row>
</h:form>
</ui:define>
</ui:composition>
</body>
</html>
Ответы
Ответ 1
Вы управляете bean CDI, а не JSF. Аннотации JSF @ViewScoped
работают только на JSF @ManagedBean
, а не на CDI @Named
. На CDI @Named
вы можете использовать только области CDI, а не области JSF. Самое близкое, что предлагает CDI, это @ConversationScoped
. Но вам нужно самому начать и начать разговор с помощью дополнительного кода шаблона.
То же самое относится к аннотации JSF @ManagedProperty
. Он работает только в JSF @ManagedBean
, а не на CDI @Named
. Для CDI вы должны использовать @Inject
или пользовательскую аннотацию параметров HTTP.
Проблема JSF 2266 не связана с этим.
Ответ 2
У меня была очень похожая (если не точная) проблема.
Я использовал Java EE 7 на Glassfish 4.0 build 89 и Primefaces 4.0. Glassfish сообщала, что использует Mojarra 2.2.0.
Я использовал аннотации типа CDI, то есть @Named и @javax.faces.view.Viewscoped.
Мой файл *.xhtml начался как
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<f:metadata>
<f:viewAction action="#{personController.initialise}" />
<f:viewParam name="id" value="#{personController.id}" />
</f:metadata>
...
Независимо от того, что я пробовал, он никогда не устанавливал мой параметр представления.
Я читал, что был вопрос с Mojarra 2.2.1 и думал, что это может быть то же самое с Mojarra 2.2.0. Updatetool не обновил Mojarra дальше, чем у меня, поэтому я сделал это вручную.
Я поместил копию последней версии Mojarra из http://repo1.maven.org/maven2/org/glassfish/javax.faces/2.2.5/ в каталог $GLASSFISH_HOME/glassfish/modules, переименовал ее javax.faces.jar и поддержку вверх по существующему файлу javax.faces.jar.
Перезапущенная Glassfish, и она сообщила, что теперь использовала Mojarra 2.2.5. Проблемы исчезли, и код работал нормально.