Seguinte, estou fazendo um sistema web usando Hibernate e VisualJSF, e em todos os meus métodos DAO estou retornando uma String ("success" ou "failure"), para fazer o mapeamento no faces.config.xml.
A duvida surgiu neste método do meu UsuarioDAO, pois este método e uma List, e logo deverá retornar uma LIST, porem preciso que ele retorne tambem uma String success ou failure. Como posso fazer isso ?
Obrigado
public List listar() {
try {
sessao = HibernateUtil.getSessionFactory().getCurrentSession();
sessao.beginTransaction();
List l1 = sessao.createQuery("from jnb_user").list();
sessao.getTransaction().commit();
resultado = SUCESSO;
return l1;
} catch (HibernateException ex) {
sessao.getTransaction().rollback();
System.err.println("Erro durante abertura de sessão do banco de dados" + ex);
resultado = FALHA;
return null;
}
}
Uma observação: voltar uma lista vazia normalmente é melhor que voltar null. É que se o outro lado não ficar esperto para o fato que pode receber null, então vai ocorrer uma NullPointerException, enquanto se você voltar uma lista vazia é mais simples tratar o resultado.
Uma observação: voltar uma lista vazia normalmente é melhor que voltar null. É que se o outro lado não ficar esperto para o fato que pode receber null, então vai ocorrer uma NullPointerException, enquanto se você voltar uma lista vazia é mais simples tratar o resultado.
Cara, confesso que nao entendi mto bem isso que vc fez. Poderia me explicar como isso resolve meu problema ? Desculpe se estou sendo chato, mas nao estou afim apenas de dar CTRL C CTRL V no codigo, quero entender e aprender… hehehehe Obrigado !
T
thingol
É assim. Você reserva o retorno do método para retornar o tal status (“success” / “failure”. )
Enquanto isso, você usa o parâmetro como se fosse um parâmetro “de saída”, ou seja, em vez de você passar dados para o método através dele, o método é que copia o resultado dentro desse parâmetro. Isso é muito comum em C, C#, C++, Pascal, VB e outras linguagens que deixam fazer isso (você modificar o parâmetro).
É que a gente se esquece que, embora o Java sempre passe parâmetros por valor e não por referência, ele deixa modificar os objetos que você passou como parâmetros.
Por isso o que fiz foi mais ou menos o seguinte:
Dentro do método, pego o parâmetro (que é uma lista), limpo tudo por via das dúvidas, e então chamo o método sessao.createQuery para me retornar um resultado.
Então, eu copio a lista dentro da lista que recebi como parâmetro, usando addAll.
Quem chama o método deve então criar uma lista vazia, passar para esse método, que a retornará cheia (se o método retornar “success”) ou vazia (se houver um problema e o método retornar “failure”). OK?
Morpheus_Urubu
Valeu cara, muito esclarecedor sua resposta ! Deu certo aqui !
Mais uma que vai pra minha bagagem de conhecimentos que estou iniciando em Java.
T
thingol
Na verdade eu faria de uma forma um pouco diferente
Eu costumo ter na minha caixa de ferramentas uma classe Pair<T, U> que é uma classe bem boba, só para conter um par de objetos de classes distintas.
Nesse caso, eu retornaria um Pair<String, List>.
Aí o primeiro elemento seria o “success/failure”, e o segundo elemento seria a tal lista. Mas não expliquei desse jeito porque muita gente é contra criar essas classes “nojentas” para fazer esse tipo de coisa.
Morpheus_Urubu
Entendo, mas se quiser explicar, estou a disposição para ler e estudar sobre, para então decidir. Achei interessante vc falar nessa segunda maneira pq eu tinha pensado justamente na possibilidade de retornar dois objetos, qdo eu me deparei com o problema hoje pela manha.
T
thingol
Eu normalmente codifico a tal classe mais ou menos assim:
publicclassPair<TextendsComparable<T>,UextendsComparable<U>>implementsComparable<Pair<T,U>>{publicTfirst;publicUsecond;publicPair(Tt,Uu){first=t;second=u;}publicintcompareTo(Pair<T,U>that){// Para simplificar, digo que ambos os campos não podem ser nulos.intc=first.compareTo(that.first);if(c!=0)returnc;returnsecond.compareTo(that.second);}publicStringtoString(){return"<"+first.toString()+", "+second.toString()+">";}}classTeste{publicPair<String,Integer>exemplo1(){returnnewPair<String,Integer>("Exemplo",1);}publicstaticvoidmain(String[]args){Testet=newTeste();Pair<String,Integer>p=t.exemplo1();System.out.println(p);}}
Marky.Vasconcelos
Essas classes são nojentas?
Então o que falariam de uma classe assim que eu uso.