在SEAM 2中捕获全局“@In属性需要非空值”

时间:2013-05-03 16:04:16

标签: java jboss5.x jsf-1.2 seam2 seam-conversation

On PAGE 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之前被抛出......所以这根本不是一个帮助......

2 个答案:

答案 0 :(得分:1)

pages.xml中指定了异常处理规则。您可以包含一条规则来捕获针对该类错误引发的org.jboss.seam.RequiredException,并执行导航到其中的页面C.

然而,这不是一个非常干净的解决方案,因为您将该异常绑定到该页面,并且很可能您会在其他地方出现此异常并希望重定向到其他页面。

实现相同结果的一种更简单的方法是在PageB.page.xml中进行对话,并指定在没有对话处于活动状态时重定向到的视图。页面描述符有一个选项,允许您这样做(在PageB.page.xml上):

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

这告诉Seam如果用户试图显示页面B并且没有活动的会话(当用户从​​书签到达时会发生这种情况),则将用户重定向到PageC.xhtml。

无论如何,使用页面参数和操作,只需要很少的努力就可以使页面可收藏(如果你觉得你的用户会给它添加书签),例如:

在您的列表页面A中,使用h:commandLinkh:commandButton s:link或s:button。 p>

<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}" />

其中myHomeComponentEntityHome<YourEntity>类型的组件。然后,您可以使用页面B中的#{myHomeComponent.instance}来访问所选实体。

答案 1 :(得分: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>

这解决了这个问题 但感谢你的帮助,但这不符合你的工作方式:(