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(起始页)?
(当然我可以捕捉到这个执行,PAGE B但这不仅发生在一个页面上,我们希望在每一页上处理这个异常)

我们正在使用: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 中,使用 or 代替h:commandLinkh:commandButton您带到页面 B 的每一行的s:linkor s: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=2在第二行中,依此类推。这些链接是可收藏的。

PageB.page.xml声明参数时:

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

myHomeComponent类型的组件在哪里EntityHome<YourEntity>。然后,您可以#{myHomeComponent.instance}在 Page B 内部使用来访问选定的实体。

于 2013-05-04T16:31:45.253 回答
0

我现在管理它不同:

Controller.java我有这样的初始化:

@Create
public void initialize() throws MissingMyEntityException {

    if(qualifiedCustomer == null){
        throw new MissingMyEntityException("something wrong");
    }
    ....
}

我的MissingMyEntityException.java样子是这样的:

public class MissingMyEntityException extends Exception {

    private static final long serialVersionUID = 8640645441429393157L;

    public MissingMyEntityException(String message) {
        super(message);
    }

}

pages.xml我有这样的异常处理程序:

<exception class="com.dw.companyName.view.xyz.exception.MissingMyEntityException">
        <redirect view-id="/pages/home.xhtml">
            <message>something went wrong</message>
        </redirect>
    </exception>

这解决了问题。
但感谢您的帮助,但它没有按照您的方式工作:(

于 2013-05-10T12:22:48.450 回答