validator not fired-6ren"> validator not fired-由于fileLimit 不再存在于primefaces 3.4 中,我正在尝试解决实现验证器的问题,问题是从未调用过validate 方法。那是我的验证器: @FacesValidator(value-6ren">
gpt4 book ai didi

jsf - PrimeFaces

validator not fired

转载 作者:行者123 更新时间:2023-12-04 01:54:44 26 4
gpt4 key购买 nike

由于fileLimit 不再存在于primefaces 3.4 中,我正在尝试解决实现验证器的问题,问题是从未调用过validate 方法。那是我的验证器:

@FacesValidator(value ="fileLimitValidator")
public class FileLimitValidator implements Validator {

@Override
public void validate(final FacesContext context, final UIComponent component,
final Object value) throws ValidatorException {

final String fileLimit = (String)component.getAttributes().get("fileLimit");
final String size = (String)component.getAttributes().get("size");

if (fileLimit!=null && size!=null) {
if (Integer.valueOf(size) >= Integer.valueOf(fileLimit)) {
FacesUtils.throwErrorExceptionFromComponent(component,"fichero_confidencialidad_error");
}
}
}
}

在我的 facelet 中,我尝试过:
    <p:fileUpload id="#{id}FileUpload"
fileUploadListener="#{bean[metodoTratarFichero]}" mode="advanced"
multiple="true" allowTypes="#{allowTypes}" showButtons="false"
update="#{id}ListaDocs #{id}MsgError" auto="true"
label="#{fileuploadmsg.label_boton}"
invalidFileMessage="#{fileuploadmsg.tipo_incorrecto}" >

<f:validator validatorId="fileLimitValidator"/>
<f:attribute name="fileLimit" value="#{fileLimit}"/>
<f:attribute name="size" value="#{listaDocumentos.size}"/>
</p:fileUpload>

和:
    <p:fileUpload id="#{id}FileUpload"
fileUploadListener="#{bean[metodoTratarFichero]}" mode="advanced"
multiple="true" allowTypes="#{allowTypes}" showButtons="false"
update="#{id}ListaDocs #{id}MsgError" auto="true"
label="#{fileuploadmsg.label_boton}"
invalidFileMessage="#{fileuploadmsg.tipo_incorrecto}"
validator="fileLimitValidator">

<f:attribute name="fileLimit" value="#{fileLimit}"/>
<f:attribute name="size" value="#{listaDocumentos.size}"/>
</p:fileUpload>

和:
    <p:fileUpload id="#{id}FileUpload"
fileUploadListener="#{bean[metodoTratarFichero]}" mode="advanced"
multiple="true" allowTypes="#{allowTypes}" showButtons="false"
update="#{id}ListaDocs #{id}MsgError" auto="true"
label="#{fileuploadmsg.label_boton}"
invalidFileMessage="#{fileuploadmsg.tipo_incorrecto}"
validator="#{fileLimitValidator}">

<f:attribute name="fileLimit" value="#{fileLimit}"/>
<f:attribute name="size" value="#{listaDocumentos.size}"/>
</p:fileUpload>

和:
    <p:fileUpload id="#{id}FileUpload"
fileUploadListener="#{bean[metodoTratarFichero]}" mode="advanced"
multiple="true" allowTypes="#{allowTypes}" showButtons="false"
update="#{id}ListaDocs #{id}MsgError" auto="true"
label="#{fileuploadmsg.label_boton}"
invalidFileMessage="#{fileuploadmsg.tipo_incorrecto}"
validator="#{fileLimitValidator.validate}">

<f:attribute name="fileLimit" value="#{fileLimit}"/>
<f:attribute name="size" value="#{listaDocumentos.size}"/>
</p:fileUpload>

但从未调用过验证方法。正确的做法是什么?

最佳答案

根据 FileUpload FileUploadRenderer 源代码,验证器仅在 mode="simple" 时被调用已被使用(注意:这反过来需要 ajax="false" 命令)。高级模式即不会将上传的文件设置为组件的提交值,导致其保留null直到调用监听器方法。只要提交的值为null ,不会调用验证器。

我不确定这是否是故意的。理论上应该可以设置UploadedFile作为提交的值并让验证器依赖它。您可能希望在 PrimeFaces issue tracker 创建增强报告。 .

同时,尽管它是 poor practice ,最好的办法是在 fileUploadListener 中真正执行验证方法。您可以通过 FacesContext 触发验证失败添加人脸消息如下:

if (fail) {
context.validationFailed();
context.addMessage(event.getComponent().getClientId(context), new FacesMessage(
FacesMessage.SEVERITY_ERROR, messageSummary, messageDetail));
}

否则,您需要为 <p:fileUpload> 创建自定义渲染器。在 decode() 期间设置提交的值(然而,我不保证它会在实践中起作用,你可能会偶然发现一个特殊的问题,这可能是 PrimeFaces 最初没有像那样实现它的原因)。

顺便说一句,您的第一次和第二次验证器尝试是正确的。第三次尝试仅在您使用 @ManagedBean 时才有效。而不是 @FacesValidator ( which is often done when injection of an @EJB is mandatory — which isn't possible in a @FacesValidator )。第四次尝试无效。

关于jsf - PrimeFaces <p :fileUpload mode ="advanced"> validator not fired,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13865136/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com