Estou com um bug em uma página do sistema que precisa validar um campo numérico de forma dinâmica com JSF.
Basicamente, tenho um facelet (xhtml) com um campo <p:inputText …/> que tem validação (com componente do Omnifaces) para verificar os valores mínimo e máximo permitidos após a digitação do usuário (disparado no blur e no ENTER).
Quando o evento de validação é disparado, ocorre um erro que trava (bloqueia) a tela em questão e o usuário não consegue fazer mais nada (aquela tela/layer cinza que bloqueia ação do usuário). Tem que dar um refresh na tela para continuar (nem F5 funciona, tem que clicar no botão refresh).
O navegador me mostra um erro de parsing de JSON no jquery.js provido pelo próprio PrimeFaces, com a seguinte mensagem:
“Uncaught SyntaxError: Unexpected token , in JSON at position 1”.
Fiz um hack no jquery.js para exibir o JSON com erro e ele, de fato, tem uma vírgula a mais:
{,“validationFailed”:true}
Quando a validação funciona (valor digitado está correto) essa vírgula a mais não existe no JSON.
Fiz alguns testes e percebi que o erro ocorrer porque há algum tipo de incompatibilidade da validação com o componente <p:treeTable …/> que existe na mesma tela. Quando eu removo este componente treeTable, a tela e a validação funcionam normalmente. Também percebi que o erro ocorre por conta da ordenação que existe nesse componente (sortBy). Se eu removo este atributo ele também funciona.
Estou usando java 8 (OpenJDK 1.8), Tomcat 7, JSF 2.2.10, PrimeFaces 5.2, PrimeFaces Extensions 3.2.0, OmniFaces 1.14, Spring Faces 2.4.4, Spring Secutiry 3.2.8, Spring 4.2.0.
Segue trecho de código do facelet:
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:o="http://omnifaces.org/ui"
xmlns:of="http://omnifaces.org/functions"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:casper="http://java.sun.com/jsf/composite/components"
xmlns:sec="http://www.springframework.org/security/tags">
...
<p:inputText id="discountPercent" widgetVar="discountPercentVar" value="#{myBean.discountPercent}" required="#{editable}">
<p:ajax listener="#{myBean.calculateDiscount()}" update="pricingFields" process="@widgetVar(dcDiscountPercentVar)" />
<f:convertNumber maxFractionDigits="2" minFractionDigits="2"/>
<o:validator validatorId="javax.faces.DoubleRange" minimum="#{myBean.minimumDiscount}" maximum="#{myBean.maximumDiscount}" message="#{of:format2(msg.error_discount, myBean.minimumDiscount, myBean.maximumDiscount)}" />
</p:inputText>
...
<!-- Pricing Tree -->
<p:treeTable id="totals" var="node" value="#{myBean.pricingTree}" sortBy="#{node.UIName}">
<p:column headerText="#{msg.qPricingGrid_breakdown}">
<h:outputText value="#{node.UIName}"/>
</p:column>
<p:column headerText="#{msg.qPricingGrid_quantity}" style="text-align:right">
<casper:quantity-field class="delivery-units-column" value="#{node.deliveryUnits}"/>
</p:column>
</p:treeTable>
</ui:composition>
Alguma dica?