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

标签 jsf facelets

我有这个本地网址:
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 默认验证机制进行空/空检查和来自 String 的转换。至 Integer .

<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);

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

相关文章:

jsf - 使用 FacesServlet 解析 Javascript 中的 EL 变量

jsf - 调用一个 Javascript 函数来点击一个(隐藏的)按钮或链接

regex - 验证器正则表达式模式输入仅接受 2-5 位数字

java - 更好 <h :selectManyCheckbox> layout?

java - Facelet dataTable : method not found in backing bean, 尝试将实例发送回 bean

HTML 缩进表

java - JSF + Primefaces : Ajax CRUD-Actions in Master-Detail-View only work once per page-load

java - 为什么不对 JSF 页面进行预编译(至少部分),而是在每次构建 View 时对其进行解析和评估?

java - 在 Facelets 中使用 JSP 2.0 标记

jsf - f :setPropertyActionListener always setting null