0

OnPAGE Aは、データベースからのデータを含むテーブルです。
行をクリックすると、ページが転送さPAGE Bれ、コントローラにエンティティが挿入されます

@DataModelSelection(value = ENTITY_LIST_NAME)
@Out(value = ENTITY_NAME, scope = ScopeType.CONVERSATION, required = false)
private Entity entity;

これは正常に機能します。

問題は、ユーザーが のブックマークを使用しているように見えるため、アクセスしPAGE Bたことがないためエンティティが挿入されないことです。PAGE A

したがって、彼らは常にこの例外をスローします

@In attribute requires non-null value

@In attribute requires non-null valueすべての例外をキャッチしてユーザーをPAGE C(startpage) に転送するグローバル関数はありますか?
(もちろん、この例外をキャッチすることはできますPAGE Bが、これは 1 つのページだけでなく、すべてのページでこの例外を処理したい)

使用している: jboss5 + jsf 1.2 + seam 2

EmirCalabuch の回答後の更新:
EmirCalabuch からのヒントも試しました。

<page conversation-required="true" no-conversation-view-id="PageC.xhtml" />

しかし、問題は、この時点で会話が生きていることです。この転送はpageC決して起こりません...

私はまたpage.xml、このページのようなものを作りました:

<action execute="#{controller.checkIfEntityIsSet()}" />
<navigation>
    <rule if-outcome="HOME">
            <redirect          
             view-id="/pages/home.xhtml"
            />
        </rule>
</navigation>

そして私の中で私Controller.javaはこのようなものを持っています:

public String checkIfEntityIsSet(){
        if(getEntity() == null){
            return "HOME"; 
        }
        return "";          
    }

が前にスローされるため、これcheckIfEntityIsSet()は決して呼び出され@In attribute requires non-null valueません...したがって、これはまったく役に立ちませんでした...

4

2 に答える 2

1

例外処理規則は で指定されていpages.xmlます。org.jboss.seam.RequiredExceptionそのタイプのエラーに対してスローされた をキャッチし、ページ C へのナビゲーションを実行するルールを含めることができます。

ただし、その例外をそのページにバインドし、おそらく他の場所でこの例外が発生し、別のページにリダイレクトしたいため、これはあまりクリーンなソリューションではありません。

同じ結果を達成するより簡単な方法は、必要な会話を作成し、PageB.page.xmlアクティブな会話がない場合にリダイレクトするビューを指定することです。ページ記述子には、それを可能にするオプションがあります ( on PageB.page.xml):

<page conversation-required="true" no-conversation-view-id="PageC.xhtml" />

これは Seam に、ユーザーがページ B を表示しようとしてアクティブな会話がない場合 (ユーザーがブックマークからそこに移動したときに発生)、ユーザーを PageC.xhtml にリダイレクトすることを伝えます。

とにかく、ページのパラメーターとアクションを使用して、ページをブックマーク可能にするのにほとんど労力はかかりません (ユーザーが頻繁にブックマークすると思われる場合)。たとえば、次のようになります。

リスト ページ A では、ページ B に移動する各行に対して or の代わりに or を使用しh:commandLinkます。h:commandButtons:links:button

<h:dataTable var="var" value="#{myList.dataModel}">
...
  <s:link value="PageB.xhtml">
      <f:param name="id" value="#{var.id}" />
  </s:link>
...
</h:dataTable>

これにより、リスト内のエンティティごとにページ B へのリンクが作成され、その ID が渡されます (たとえば、PageB.seam?id=1最初の行、PageB.seam?id=22 番目の行など)。これらのリンクはブックマーク可能です。

パラメータPageB.page.xmlを宣言すると:

<param name="id" value="#{myHomeComponent.id}" />

myHomeComponentはタイプ のコンポーネントですEntityHome<YourEntity>。次に、#{myHomeComponent.instance}ページ B 内を使用して、選択したエンティティにアクセスできます。

于 2013-05-04T16:31:45.253 に答える