Sobrescrita método toString() em um EntityBean

16 respostas
R

Será que alguém saberia como sobrescrever o método toString() de um EJB EntityBean??

16 Respostas

urubatan
public String toString(){

//corpo do metodo aqui

}

acho que não precisa nem colocar na interface :slight_smile:

R

Pois então,

Eu já tentei usar isto direto na minha Classe Bean e ja tentei declará-lo na minha interface Remote também, mas de nenhuma maneira funcionou.

<blockquote><div class="quote-author">“urubatan”:</div>public String toString(){

//corpo do metodo aqui

}

acho que não precisa nem colocar na interface :-)

urubatan

posta aqui uma parte do codigo que tu ta usando para declarar e para chamar isto que vejo o que pode ser :slight_smile:

R

Abaixo estão as duas interfaces e a minha classe Bean. A sobrescrita do método estou fazendo na minha classe Bean.

EscopoBean.java

import javax.ejb.EntityBean;

import javax.ejb.EntityContext;

import javax.ejb.CreateException;

import javax.ejb.FinderException;

public abstract class EscopoBean implements EntityBean {
private EntityContext context;

public abstract void setEscopoId(Integer escopoId);

public abstract Integer getEscopoId();

public abstract void setNome(String nome);

public abstract String getNome();

public abstract void setEstrutura(String estrutura);

public abstract String getEstrutura();

public abstract void setDescricao(String descricao);

public abstract String getDescricao();

public abstract void setObservacoes(String observacoes);

public abstract String getObservacoes();

public Integer ejbCreate(Integer escopoId, String nome, String estrutura, String descricao) throws CreateException {
this.setEscopoId(escopoId);
this.setNome(nome);
this.setEstrutura(estrutura);
this.setDescricao(descricao);
return escopoId;
}

public void ejbPostCreate(Integer escopoId, String nome, String estrutura, String descricao) throws CreateException {
}

public void ejbActivate() {
}

public void ejbPassivate() {
}

public void ejbLoad() {
}

public void ejbStore() {
}

public void ejbRemove() {
}

public void setEntityContext(EntityContext context) {
this.context = context;	    
}

public void unsetEntityContext() {
context = null;	    	
}

public String toString() {
    return this.getNome();
}

}

EscopoHome.java

import javax.ejb.EJBHome;

import javax.ejb.CreateException;

import javax.ejb.FinderException;

import java.rmi.RemoteException;

import java.util.Enumeration;
public interface EscopoHome extends EJBHome {

public Escopo create(Integer escopoId, String nome, String estrutura, String descricao) throws CreateException, RemoteException;

public Escopo findByPrimaryKey(Integer escopoId) throws FinderException, RemoteException;

public Enumeration findAll() throws FinderException, RemoteException;

}
Escopo.java

import javax.ejb.EJBObject;

import java.rmi.RemoteException;
public interface Escopo extends EJBObject {

public abstract void setEscopoId(Integer escopoId) throws RemoteException;

public abstract Integer getEscopoId() throws RemoteException;

public abstract void setNome(String nome) throws RemoteException;

public abstract String getNome() throws RemoteException;

public abstract void setEstrutura(String estrutura) throws RemoteException;

public abstract String getEstrutura() throws RemoteException;

public abstract void setDescricao(String descricao) throws RemoteException;

public abstract String getDescricao() throws RemoteException;

public abstract void setObservacoes(String observacoes) throws RemoteException;

public abstract String getObservacoes() throws RemoteException;

}[/b]
urubatan

e como você esta chamando o metodo??

R

Eu estou tentando utilizar para construir um JComboBox com o retorno do método findAll(). Só que não estou conseguindo. Abaixo segue um exemplo de como utilizo o Bean atráves do método findByPrimaryKey.

properties = new Properties();
    properties.put(Context.PROVIDER_URL,"localhost:1099");	      properties.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");             properties.put(Context.URL_PKG_PREFIXES,"org.jboss.naming:org.jnp.interfaces");
    initialContext = new InitialContext(properties); 
    Object ref = initialContext.lookup("Escopo");
    escopoHome = (EscopoHome) PortableRemoteObject.narrow(ref,EscopoHome.class);
    escopo = escopoHome.findByPrimaryKey(new Integer(1));	    
    System.out.println(escopo.toString());
urubatan

e o que esta aparecendo no ComboBox??

R

Pois então, aqui é que tá.
No meus items do combo estão aparecendo uma string que é formada pelo nome_do_bean:chave_primaria_bean.
Exemplo: Escopo:1
Escopo:2
Escopo:3
Escopo:N
Eu gostaria que ao invés de aparecer esta String, aparecesse o que eu defini na sobrescrita do método toString(), que é o atributo nome do Escopo.

Paulo_Silveira

“rodrigo”:
Pois então, aqui é que tá.
No meus items do combo estão aparecendo uma string que é formada

Eh porcausa do stub… eh o toString dele q esta sendo chamado.
Voce tem certeza que ja tentou declarar o toString na interface? ai teoricamente ele teria de fazer a chamada remota. (talvez a spec diga alguma coisa sobre os metodos do Object, nao manjo nada de ejb)

R

“Paulo Silveira”:

Eh porcausa do stub… eh o toString dele q esta sendo chamado.
Voce tem certeza que ja tentou declarar o toString na interface? ai teoricamente ele teria de fazer a chamada remota. (talvez a spec diga alguma coisa sobre os metodos do Object, nao manjo nada de ejb)

Pois eh. Eu já tentei declarar na minha interface Remote, mas a unica forma que consegui declarar para o código poder compilar foi omitindo as exceções. Eu declarei assim:

public String toString();

declarando assim:

public String toString() throws RemoteException;

da erro na compilação pois a sobrescrita do método não pode possuir exceção.

Só que daí entro em outro problema. Declarando da primeira forma o EJB não consegue fazer o deploy pois o método declarado na interface remote sem exceção não obedece a especificação RMI-IIOP.

claudio

Oia gente,

eu acho que NAO deve funcionar por uma simples incompatibilidade entre o java e o framework do EJB.

O Paulo esta certo, o metodo para ser remoto tem que estar na interface remota, senao o toString chamado vai ser o do stub.

Bom se os metodos da interface remota lancam RemoteException e o toString original da classe Object nao lanca nenhuma exception, vc nao pode redeclara-lo lancando exceptions (regra basica de sobreescrita), logo mesmo que vc coloque na interface remota nao deve funcionar!

[Obs] Resposta baseada em conhecimento apenas, nao testei aqui :slight_smile:

Abraco,

Paulo_Silveira

eh rodrigo… pelo visto pode esquecer e criar um toMyString …
nao vai dar pra lancar o remote como o claudio falou, ja era.

ozielneto

Realmente o Paulo e o Claudio estao certos…

A Chamada remote.toString() está executando o toString() do Stub do EJB…

Se voce quiser colher informacoes como o toString() faz, siga a sugestao do Paulo… Faça uma chamada remota para um metodo com uma assinatura diferente do toString(), ex. getDetails() , e assim voce conseguira o que quer…

Por varias questoes, o acesso a EntityBean deve ser feito atraves de SessionBeans… E nao diretamente com voce esta fazendo…

Bom trabalho…

L

pq vc naum cria Bean, por exemplo um VO (Value Object) e declara os metodos dentro dele , assim vc pode sobreescrever o metodo toString()!

D

Escrever métodos toString é realmente uma chatisse. XDoclet gera os ValueObjects e junto com eles os toStrings que formatam uma string legal com os valores a serem impressos no toString(). Se você quiser mudar o formato do value object gerado, basta mudar o template .xdt localizado no módulo ejb do xdoclet.

cv1

Outra ajuda nesse caso é usar o ToStringBuilder do Jakarta Commons Lang :slight_smile:

Criado 12 de maio de 2003
Ultima resposta 24 de mai. de 2003
Respostas 16
Participantes 8