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
之前被抛出......所以这根本不是一个帮助......
答案 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:commandLink
或h:commandButton
1}的每一行,而不是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}" />
其中myHomeComponent
是EntityHome<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>
这解决了这个问题 但感谢你的帮助,但这不符合你的工作方式:(