Bom dia!
Gostaria de saber se existe alguma forma de executar os converters do VRaptor de forma inteligente.
Eu estou criando uma funcionalidade de filtro genérica para qualquer entidade. Um dos filtros é o Restrictions.eq, mas se eu simplesmente passar um objeto do tipo String, o Hibernate não vai conseguir fazer o cast…
Eu tenho isso aqui:
// operation tem um converter do converter que retorna a implementação correta para cada caso...
public class DataTablesFilter {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
private String column;
private String value;
private QueryOperation operation;
public void apply(Criteria criteria, Class<?> entity) {
try {
criteria.add(operation.apply(this, entity));
} catch (UnsupportedOperationException e) {
logger.info("Cannot apply this filter.\n" + e.getMessage());
}
}
// Getters e setters
}
Essa aqui é uma das implementações de QueryOperation:
[code]public class StartQueryOperation implements QueryOperation {
@Override
public Criterion apply(DataTablesFilter filter, Class<?> entity) {
if (Utils.notEmpty(filter.getValue()))
return Restrictions.ilike(filter.getColumn(), filter.getValue(),
MatchMode.START);
throw new UnsupportedOperationException(
"Cannot apply this Criterion when filter value is empty.");
}
}[/code]
Mas ai tudo bem usar String para o ilike, o problema é aqui:
public class EqQueryOperation implements QueryOperation {
@Override
public Criterion apply(DataTablesFilter filter, Class<?> entity) {
if (Utils.notEmpty(filter.getValue())) {
try {
Field field = entity.getField(filter.getColumn());
// Continua de alguma forma.
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return Restrictions.eq(filter.getColumn(), filter.getValue());
}
throw new UnsupportedOperationException(
"Cannot apply this Criterion when filter value is empty.");
}
}
Eu precisaria passar para o eq() um Object que pode ser convertido para o tipo da coluna… O maior problema é fazer um converter para aqueles casos onde acessamos um atributo de um atributo…