jsf 2.0在GET参数验证失败后返回http错误代码

Til*_*err 5 jsf facelets

我有这个本地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>
Run Code Online (Sandbox Code Playgroud)

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

flkatid:'AAA'必须是由一个或多个数字组成的数字.flkatid:'AAA'必须是-2147483648和2147483647之间的数字示例:9346

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

是否有可能让服务器返回HTTP错误代码,例如403(禁止)而不离开"标准JSF世界"(或切换到RichFaces,MyFaces,SmileyFaces或其他)?我在f:viewParam中找不到任何"失败"的页面.在其他地方?

Bal*_*usC 4

你可以ExternalContext#responseSendError()在验证器内部做一个。但这要求该值被声明为 aString而不是,Integer并且required="true"已被删除,所有这些都是为了防止 JSF 默认验证机制进行 null/empty 检查以及从String到 的转换Integer

<f:metadata>
    <f:viewParam name="flkatid" value="#{floKatBean.flkatid}" 
        validator="#{floKatBean.validateFlKatId}" 
        validatorMessage="URL incomplete or invalid" 
    />
    ...
</f:metadata>
Run Code Online (Sandbox Code Playgroud)

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"));
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在方法中进行转换init()

this.flkatidInteger = Integer.valueOf(this.flatkid);
Run Code Online (Sandbox Code Playgroud)