申し訳ありませんが、おそらく別の本当に基本的な質問です。私のViewScopedBeanでは、「viewParam」は設定されているように見えますが、使用するようになると、値はnullになります。セッター(setEventId())にブレークポイントを設定すると、値が取得されますが、preRenderViewで指定されたメソッドでは、ブレークポイントがなくなったため、取得しようとしているEventオブジェクトを読み込めません。
BeanがRequestScopedの場合、これは正常に機能していましたが、POSTとその後の検証エラーですべての詳細が失われ、ViewScopedがこの問題を回避する方法であることがわかりました。
バグの可能性があると思ったため、Mojarra 2.1.7にアップグレードしました。実際、2.1.7で修正された「重大なバグ」がJIRAにリストされていますが、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>