Eis o problema os campos de uma determinada tela seriam construídos dinâmicamente, e cada campo tinha as suas peculiaridades de validação, a idéia que tivemos foi então efetuar também a validação de forma dinâmica, veja o exemplo, temos um formulário dinâmico com um campo chamado telefone e o campo telefone é de preenchimento obrigatório se fosse feito em código, você escreveria algo parecido com isto:
"".equals(telefone);caso o código acima tenha um retorno verdadeiro, o campo não foi preenchido, mas ai vem o problema, não dá para implementar isto de forma dinâmica, onde apenas uma alteração no banco já mudaria as regras de validação, pensei em usar o drools, mas a solução do drools parecia complexa demais para resolver apenas um simples problema de validação. Assim cheguei a solução descrita aqui, basicamente usei algo que todo projeto web tem, o EL (Expressions Language), esta linguagem de expressões foi usada de forma realmente interessante com o uso do SEAM, o SEAM contém uma classe chamada Expressions que cria MethodExpressions e ValueExpressions, no caso o que queria saber é se um VALOR era verdadeiro ou não, portanto usei o ValueExpressions, fiz a seguinte prova conceito.
Em um managedBean coloquei o seguinte código:
Object retorno = Expressions.instance().createValueExpression("#{1<2}").getValue(); System.out.println(retorno);O interessante deste código foi que ele retornou corretamente o valor true, visto que 1 é menor que 2, portanto percebi que podemos validar assim agora o problema era como validar o formulário, bem foi usado outro objeto do seam chamado Contexts, este objeto permite acesso aos contextos do seam, Contexts.getSessionContext() por exemplo retorna um Context que contém os objeto colocado em sessão, o código ficou assim:
Contexts.getEventContext().set("a", 1); Contexts.getEventContext().set("b", 2); Object retorno = Expressions.instance().createValueExpression("#{a<b}").getvalue(); Contexts.getEventContext().remove("a"); Contexts.getEventContext().remove("b"); System.out.println(retorno);Agora ele avaliou o valor de a e b e retornou true, reparem que os valores 1 e 2 não estão mais na expressão, mas sim no contexto de evento, que é o primeiro a ser consultado pelo seam usei ele para evitar conflito de nomes nos outros contextos sendo que logo após a execução o contexto foi limpo, de posse do retorno da expressão podemos agora validar o campo de forma dinâmica, realmente interessante a solução e muito simples de ser usada visto que reutiliza o conhecimento que o programador já possui ao criar as expressões de valor EL.