Fazendo alguns testes com o Seam acabei descobrindo uma falha de compatibilidade do Seam Generator da versão 2.1 com as versões anteriores. O problema reside nos filtros que são criados nas páginas de listagens.
Nas versões anteriores, o componente para as páginas de listagens sobrescreviam os métodos:
- getEjbql: Consulta EJB QL usada para a listagem.
- getMaxResults: Define a quantidade de registros a serem retornados pela listagem.
- getRestrictions: Retorna lista de restrições a serem adicionadas a consulta.
Porém na versão 2.1 estes métodos deixaram de ser usados na geração do código. O problema é que o método getRestrictions teve o retorno aterado. Nas versões anteriores ele retornava uma lista de Strings, já na versão 2.1 o tipo de retorno foi alterado para uma lista de ValueExpression.
Com isto um código gerado na versão na versão 2.0.3, por exemplo, gera ClassCastException ao tentar converter String em ValueExpression. Solução? Atualizar o código, veja o antes e o depois:
@Name("userList") public class UserList extends EntityQuery { private static final String[] RESTRICTIONS = { "lower(user.login) like concat(lower(#{userList.user.login}),'%')", "lower(user.name) like concat(lower(#{userList.user.name}),'%')"}; private final User user = new User(); @Override public String getEjbql() { return "select user from User user"; } @Override public Integer getMaxResults() { return 25; } public User getUser() { return user; } @Override public List<string> getRestrictions() { return Arrays.asList(RESTRICTIONS); } }
A versão 2.1 o código gerado é algo semelhante a:
@Name("userList") public class UserList extends EntityQuery<user> { private static final String EJBQL = "select user from User user"; private static final String[] RESTRICTIONS = { "lower(user.login) like concat(lower(#{userList.user.login}),'%')", "lower(user.name) like concat(lower(#{userList.user.name}),'%')"}; private final User user = new User(); public UserList() { setRestrictionExpressionStrings(Arrays.asList(RESTRICTIONS)); setMaxResults(25); setEjbql(EJBQL); } public User getUser() { return user; } }
Até que seja corrigido o problema fica a dica.