3

申し訳ありませんが、おそらく別の本当に基本的な質問です。私の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>
4

2 に答える 2

2

JSFではなくCDIでBeanを管理しています。JSF@ViewScopedアノテーション@ManagedBeanは、CDIではなくJSFでのみ機能し@Namedます。CDI@Namedでは、CDIスコープのみを使用でき、JSFスコープは使用できません。CDIが提供するものに最も近いのは@ConversationScopedです。ただし、会話の開始と終了は、追加の定型コードを使用して自分で管理する必要があります。

同じ話がJSF@ManagedPropertyアノテーションにも当てはまります。これはJSF@ManagedBeanでのみ機能し、CDIでは機能しません@Named。CDIの場合は、@InjectまたはカスタムHTTPパラメータアノテーションを使用する必要があります。

JSFの問題2266は、これとは無関係です。

于 2012-05-14T12:29:00.363 に答える
1

私は非常によく似た(正確ではないにしても)問題を抱えていました。Glassfish4.0ビルド89とPrimefaces4.0でJavaEE7を使用していました。Glassfishは、Mojarra2.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に問題があることを読み、Mojarra2.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を再起動すると、Mojarra2.2.5を使用していることが報告されました。問題はなくなり、コードは正常に機能しました。

于 2014-01-13T10:50:29.663 に答える