Richfaces 错误页面重定向与 gatein,jboss 5.1.0 ga portlet 桥罐和我的错误
Richfaces error page redirection with gatein, jboss 5.1.0 ga portlet bridge jars and my mistakes
我知道有很多关于 same/similar 主题的类似问题,但我无法对我的问题应用任何解决方案。
我想在呈现 portlet 页面时捕获异常时将用户重定向到自定义错误页面。
为什么在呈现页面时抛出异常?这是因为我们在后台抛出它来为用户提供一些有用的信息,以这种方式设计并且不会很快更改,所以我打算保持这种方式。
我想举个例子会更好:
这是一个简单的 portlet,我提供用户名并按“>>”按钮来获取有关该用户的一些信息,在之前的实现中它工作正常,请参见第二张图片..
第二张图片:
as you can see layout is correct""(this is how it looked) the error
page has simply replaced the portlet content with its own content and
the error message that why we could not get any information about the
user. So far so good.
现在让我们看看问题案例:我们已经从 jboss 4.2.3 ga 升级到 5.1.0 ga,现在 GateIn 开始发挥作用。也有用于创建此 portlet 视图的旧 jar,现在它们都已升级到较新的。
如:
(org.richfaces.framework) Richfaces-api 3.3.3-final,
(org.richfaces.framework) Richfaces-impl 3.3.3-final,
(org.richfaces.framework) Richfaces-ui 3.3.3-final,
(com.sun.faces) jsf-api 2.2.14,
(com.sun.faces) jsf-impl 2.2.14,
(javax-servlet) servlet-api 2.5,
(javax-servlet) jstl 1.2
Gatein version: 3.4
gatein 本身使用 jsr168 兼容的 jar + 我们有 jsf 1.2 版本(此版本使用标签)。
问题案例:
如您所见,我们想要获取一些用户信息的 portlet 已损坏并合并到域详细 portlet 中。看起来像汤。
产生这种混乱的代码也属于我们。曾经工作正常,但现在它以某种方式破坏了整个布局。
让我向您展示渲染视图的代码:
public void renderView(FacesContext context, UIViewRoot viewToRender) throws java.io.IOException, javax.faces.FacesException{
try {
super.renderView(context, viewToRender);
}catch(FacesException e){
Application application = context.getApplication();
ViewHandler viewhandler = application.getViewHandler();
PortletRequest request = (PortletRequest)context.getExternalContext().getRequest();
PortletConfig config = (PortletConfig)request.getAttribute(PortletConstants.PORTLET_CONFIG);
String errorView = config.getInitParameter(PortletConstants.PORTLET_FACES_ERROR_VIEW);
if(errorView == null || errorView.matches("")){
errorView = ProvPortletViewHandler.DEFAULT_FACES_ERROR_VIEW;
}
Throwable cause = e.getCause();
FacesMessage fm= findProvisioningException(cause);
if(fm == null)
{
request.setAttribute("ErrorMessage", "Unknown Error occured");
}
else
{
request.setAttribute("ErrorMessage", fm.getSummary());
}
viewToRender = viewhandler.createView(context,errorView);
context.setViewRoot(viewToRender);
viewhandler.renderView(context, viewToRender);
PortletSession objSes = (PortletSession)context.getExternalContext().getSession(false);
objSes.invalidate();
}
}
在这段代码中,可以看到有super.renderView(context, viewToRender);
它一直到服务并进行服务调用。服务调用 returns 这个用户在数据库中没有信息的异常。并在路上将此异常转换为FacesException(我们正在做)。
问题不在于异常,也不在于将其转换为 FacesException。
问题出现在这部分
viewToRender = viewhandler.createView(context,errorView);
context.setViewRoot(viewToRender);
viewhandler.renderView(context, viewToRender);
据我们调试。我们相信由于异常而部分呈现的旧视图无法用错误视图替换。
但是,如果它以前可以工作,那该怎么办。我们没有更改这部分代码。
这些信息是否足以引发关于问题的想法?
你们需要更多细节吗?
你认为我们做错了什么?
感谢和问候
深究后发现,当request来的时候,它的response是在这个点创建和填充的。里面已经有HTML个内容了。尝试重定向新的 jsp 文件时,它会将新的 HTML 元素附加到该响应。因此,响应中的 HTML 个元素对 Gate-in 变得模糊不清。
为了避免这个问题,重置响应就足够了。可以重置response buffer,代码上可以看到;
viewToRender = viewhandler.createView(context, errorView);
context.setViewRoot(viewToRender);
**((javax.portlet.RenderResponse) context.getExternalContext().getResponse()).resetBuffer();**
viewhandler.renderView(context, viewToRender);
我知道有很多关于 same/similar 主题的类似问题,但我无法对我的问题应用任何解决方案。
我想在呈现 portlet 页面时捕获异常时将用户重定向到自定义错误页面。 为什么在呈现页面时抛出异常?这是因为我们在后台抛出它来为用户提供一些有用的信息,以这种方式设计并且不会很快更改,所以我打算保持这种方式。
我想举个例子会更好: 这是一个简单的 portlet,我提供用户名并按“>>”按钮来获取有关该用户的一些信息,在之前的实现中它工作正常,请参见第二张图片..
第二张图片:
as you can see layout is correct""(this is how it looked) the error page has simply replaced the portlet content with its own content and the error message that why we could not get any information about the user. So far so good.
现在让我们看看问题案例:我们已经从 jboss 4.2.3 ga 升级到 5.1.0 ga,现在 GateIn 开始发挥作用。也有用于创建此 portlet 视图的旧 jar,现在它们都已升级到较新的。 如:
(org.richfaces.framework) Richfaces-api 3.3.3-final,
(org.richfaces.framework) Richfaces-impl 3.3.3-final,
(org.richfaces.framework) Richfaces-ui 3.3.3-final,
(com.sun.faces) jsf-api 2.2.14,
(com.sun.faces) jsf-impl 2.2.14,
(javax-servlet) servlet-api 2.5,
(javax-servlet) jstl 1.2
Gatein version: 3.4
gatein 本身使用 jsr168 兼容的 jar + 我们有 jsf 1.2 版本(此版本使用标签)。
问题案例: 如您所见,我们想要获取一些用户信息的 portlet 已损坏并合并到域详细 portlet 中。看起来像汤。
产生这种混乱的代码也属于我们。曾经工作正常,但现在它以某种方式破坏了整个布局。
让我向您展示渲染视图的代码:
public void renderView(FacesContext context, UIViewRoot viewToRender) throws java.io.IOException, javax.faces.FacesException{
try {
super.renderView(context, viewToRender);
}catch(FacesException e){
Application application = context.getApplication();
ViewHandler viewhandler = application.getViewHandler();
PortletRequest request = (PortletRequest)context.getExternalContext().getRequest();
PortletConfig config = (PortletConfig)request.getAttribute(PortletConstants.PORTLET_CONFIG);
String errorView = config.getInitParameter(PortletConstants.PORTLET_FACES_ERROR_VIEW);
if(errorView == null || errorView.matches("")){
errorView = ProvPortletViewHandler.DEFAULT_FACES_ERROR_VIEW;
}
Throwable cause = e.getCause();
FacesMessage fm= findProvisioningException(cause);
if(fm == null)
{
request.setAttribute("ErrorMessage", "Unknown Error occured");
}
else
{
request.setAttribute("ErrorMessage", fm.getSummary());
}
viewToRender = viewhandler.createView(context,errorView);
context.setViewRoot(viewToRender);
viewhandler.renderView(context, viewToRender);
PortletSession objSes = (PortletSession)context.getExternalContext().getSession(false);
objSes.invalidate();
}
}
在这段代码中,可以看到有super.renderView(context, viewToRender);
它一直到服务并进行服务调用。服务调用 returns 这个用户在数据库中没有信息的异常。并在路上将此异常转换为FacesException(我们正在做)。
问题不在于异常,也不在于将其转换为 FacesException。
问题出现在这部分
viewToRender = viewhandler.createView(context,errorView);
context.setViewRoot(viewToRender);
viewhandler.renderView(context, viewToRender);
据我们调试。我们相信由于异常而部分呈现的旧视图无法用错误视图替换。
但是,如果它以前可以工作,那该怎么办。我们没有更改这部分代码。
这些信息是否足以引发关于问题的想法? 你们需要更多细节吗? 你认为我们做错了什么?
感谢和问候
深究后发现,当request来的时候,它的response是在这个点创建和填充的。里面已经有HTML个内容了。尝试重定向新的 jsp 文件时,它会将新的 HTML 元素附加到该响应。因此,响应中的 HTML 个元素对 Gate-in 变得模糊不清。 为了避免这个问题,重置响应就足够了。可以重置response buffer,代码上可以看到;
viewToRender = viewhandler.createView(context, errorView);
context.setViewRoot(viewToRender);
**((javax.portlet.RenderResponse) context.getExternalContext().getResponse()).resetBuffer();**
viewhandler.renderView(context, viewToRender);