Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当托管bean构造函数发送404错误代码时,JSF调用方法_Jsf_Jsf 2 - Fatal编程技术网

当托管bean构造函数发送404错误代码时,JSF调用方法

当托管bean构造函数发送404错误代码时,JSF调用方法,jsf,jsf-2,Jsf,Jsf 2,在JSF托管bean构造函数中,我使用请求参数从数据库加载实体。有时,实体不在数据库中,我想用404消息显示其他JSF(.xhtml)页面。 这是托管bean的一个示例: @ManagedBean(name = "someBean") @RequestScoped public class SomeBean implements Serializable { private static final long serialVersionUID = 1L; private S

在JSF托管bean构造函数中,我使用请求参数从数据库加载实体。有时,实体不在数据库中,我想用404消息显示其他JSF(.xhtml)页面。
这是托管bean的一个示例:

@ManagedBean(name = "someBean")
@RequestScoped
public class SomeBean implements Serializable {

    private static final long serialVersionUID = 1L;

    private SomeData someData;

    public SomeBean() throws IOException {
        someData = ... loads from database using JPA features
        if(someData == null){
              HttpServletResponse response = (HttpServletResponse) FacesContext
                    .getCurrentInstance().getExternalContext().getResponse();
              response.sendError(404);
        }
    }

    public SomeData getSomeData(){
        return someData;
    }
}
我对web.xml文件进行了如下配置:

<error-page>
   <error-code>404</error-code>
   <location>/404.xhtml</location>
</error-page>

404
/404.xhtml
我有一个JSF页面来处理托管bean加载的实体。当实体存在时,我将在页面中使用它。就像这样:

<h1>#{someBean.someEntity.name}</h1>
<h2>#{someBean.someEntity.description}</h2>
<ui:repeat value="#{someBean.someEntity.books}" var="book">
// ..........
</ui:repeat>
#{someBean.someEntity.name}
#{someBean.someEntity.description}
// ..........
当托管服务器成功加载数据时,上面的页面起作用

问题 当实体不存在并且我发送了404错误代码时,JSF仍然处理在第一页的表达式语言中定义的方法。
此行为使托管bean抛出NullPointerException和HTTP 500错误代码。
未调用我的404错误页。我不知道为什么

我尝试发送404错误,即使在数据库中找到实体并且404错误页面正常工作时也是如此


Enyone能解释这种JSF行为的快乐吗?或者提供某种方式来显示404错误页面而不更改URL?

您基本上是在呈现视图时尝试执行前端控制器逻辑。应该在渲染视图之前执行此操作。因为,一旦开始呈现视图,将视图更改为其他目标(例如,您案例中的错误页面)已经太晚了。也就是说,您不能从客户端取回已发送的响应

在JSF2.2中,您可以使用
来实现这一点

<f:metadata>
    <f:viewAction action="#{bean.init}" />
</f:metadata>
(请注意,每当您需要将
javax.servlet.*
类导入JSF支持bean时,您都应该停下来看看该功能在中是否已经可用,或者如果您以正确的方式进行操作,请三思而后行,例如,您可能需要一个servlet过滤器;还请注意,您需要明确地告诉JSF'已完成响应,否则仍将尝试渲染视图)

在JSF2.0/2.1中,您可以使用
实现这一点


如果你真的试图验证一个HTTP请求参数,你也碰巧使用了OMNIFACES,你可以考虑使用一个真正的JSF验证器来使用<代码> <代码>,用OnnIFIFACS来控制<代码> SeordRror 。< /P>什么服务器?什么是FACESServices的URL映射?在Wildfly上,至少当映射到*XHTMLI时它会起作用。使用Tomcat 7、Servlet 3.0 API和JSF 2.2。问题也出现在其他JSF 2版本中。我使用Tomcat 7、Servlet 3.0 API和JSF 2.2。问题也出现在其他JSF 2版本中。我使用配置的WELD CDI实现手册,但问题也出现在没有WELD CDI的Tomcat中。我尝试使用

FacesContext.getCurrentInstance().responseComplete();
什么都没有。我认为这种行为在JSF生命周期中是正确的,但我无法理解。我使用常见的FacesServlet映射(
/faces/*
),使用PrettyFaces将URL映射到.xhtml文件;工作正常,但报告的问题除外。

如果没有PrettyFaces,问题也会发生。我获得
HTTP状态500-在提交响应后无法创建会话,使用简单的
f:viewAction
在backingbean中调用init方法,其中init方法调用
…getExternalContext().responseSendError(404,null);
我从mojarra查找jsf的源代码,responseSendError看起来只是调用HttpServletResponse.sendError,与调用responseComplete的OminiFaces不同。因此,响应的某些原因“已提交错误”?好的,另请参阅。我将更新答案。我已经测试过,并且工作得很好。但是,转换器/验证器的责任是做这个操作吗?我认为在一个验证器/转换器内部,出于责任,在响应上设置错误是非常困难的。我将把转换器/验证器放在支持bean方法中。现在,这将是令人惊讶的。非常感谢