A post visa basicamente esclarecer a abordagem dada pelo spring framework, mais precisamente, sua implementação do JDBC, spring-jdbc.
Sem entrar em maiores detalhes sobre a implementação e utilização do módulo spring-jdbc, eu gostaria de compartilhar com todos uma experiência que me pareceu inusitada enquanto montava um DAO usando como base este módulo do spring framework.
Sem mais, às formalidades:
Meu DAO de exemplo, é o seguinte:
public class MeuBeanDao extends JdbcDaoSupport {
public MeuBean selectByDescription(String description){
return (MeuBean) getJdbcTemplate().queryForObject(SQL, new Object[]{description}, new MeuBeanRowMapper());
}
}
É uma implementação básica do método queryForObject() usando um array de Object para passar os argumentos e uma implementação do RowMapper, que visa mapear o resultado obtido de cada linha para o objeto a ser retornado.
Até aí tudo bem. Está tudo certo. Meu teste de unidade se saiu perfeito. Porém, num cenário onde não há resultados, exceções podem acontecer.
Por quê?
Porque sim.
O spring framework tem a abordagem de levantar exceções para ambos casos: resultado vazio e non-unique error (quando mais de uma linha é obtida da consulta). No meu caso, eu obtive um EmptyResultDataAccessException. O Spring opta por escolher representar os dois casos como exceções. Todavia, nos parece mais intuitivo se este, ao não encontrar nenhum registro, retornasse um simples java null.
A solução!
A solução encontrada é circundá-lo com um bloco try/catch. Veja abaixo como ficou.
public MeuBean selectByDescription(String description) {
MeuBean result = null;
try{
result = (MeuBean) getJdbcTemplate().queryForObject(SQL, new Object[]{description}, new MeuBeanRowMapper());
}catch(EmptyResultDataAccessException e){
// do nothing... thanks Spring framework...
}
return result;
}
Bom, mais uma postagem colaborativa. Maiores detalhes sobre spring-jdbc, visite o site: http://static.springsource.org/spring/docs/2.0.x/reference/jdbc.html
Abraços!