我有这个本地URL:
http://localhost:8084/Name/faces/Blah.xhtml?flkatid=AAA

这是一个来自facelet的片段,该片段检查参数“flkatid”并将其分配给bean:

    <f:metadata>
        <f:viewParam name="flkatid"
                     id="flkatid"
                     value="#{floKatBean.flkatid}"
                     required="true"
                     requiredMessage="URL incomplete"
                     validator="#{floKatBean.validateFlKatId}"
                     validatorMessage="URL incomplete or invalid"
                     >
        </f:viewParam>
        <f:event type="preRenderView" listener="#{floKatBean.init}"/>
        <f:event type="preRenderView" listener="#{floBean.holFloListe}"/>
    </f:metadata>

floKatBean.flkatid是整数,因此URL无效。将显示一个页面,该页面告诉您:

flkatid:“AAA”必须是由一个或多个数字组成的数字。 flkatid:“AAA”必须是-2147483648和2147483647之间的数字,例如:9346

JSF检查参数本身,因为它知道bean元素是一个整数。仅当参数为整数时,才调用自定义验证器。

是否有可能使服务器返回HTTP错误代码,例如403(禁止)而没有离开“标准JSF世界”(或切换到RichFaces,MyFaces,SmileyFaces或其他任何东西)吗?我无法在f:viewParam中找到任何使页面“失败”的内容。也许在其他地方?

最佳答案

您可以在验证器中执行 ExternalContext#responseSendError() 。但这要求将该值声明为String而不是Integer,并删除required="true",所有这些都是为了防止JSF默认验证机制执行null/empty检查以及从StringInteger的转换。

<f:metadata>
    <f:viewParam name="flkatid" value="#{floKatBean.flkatid}"
        validator="#{floKatBean.validateFlKatId}"
        validatorMessage="URL incomplete or invalid"
    />
    ...
</f:metadata>


public void validate(FacesContext context, UIComponent component, Object value)
    throws ValidatorException, IOException
{
    if (value == null || !((String) value).matches("\\d+")) {
        context.getExternalContext().responseSendError(
            403, (String) component.getAttributes().get("validatorMessage"));
    }
}

您可以改为使用init()方法进行转换。
this.flkatidInteger = Integer.valueOf(this.flatkid);

关于GET参数验证失败后,jsf 2.0返回http错误代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6186121/

10-16 21:30