Problemas gerando código com XDOCLET

7 respostas
S

Alguém poderia me ajuda??, estou tendo um problema que não consigo resolver, ao fazer o deploy de um BEAM que foi gerado usando XDOCLET estou tendo a seguinte mensagem no JBOSS 3.2.3

WARN  [verifier] EJB spec violation: 
Bean   : Programa
Method : public abstract void remove() throws RemoveException, RemoteException
Section: 12.2.9
Warning: Each home method must match a method defined in the entity bean class.

Alguém tem idéia onde estou errando? segue o código abaixo:

Sou novo no forum e espero poder contribuir em algo com todos também!

grato,

package com.seguranca.ejb;

import javax.ejb.EntityBean;
import javax.ejb.RemoveException;


/**
 * Classe que representa os programas que podem ser acessados pelo sistema
 * 
 * @ejb.bean 
 * 	name="Programa"
 * 	jndi-name="${app.name}/ProgramaBean"
 * 	type="CMP"
 *  	primkey-field="codigo"
 * 	schema="programa" 
 * 	cmp-version="2.x"
 * @ejb.persistence
 * 	 table-name="tbprograma"
 * @ejb.util 
 * 	generate="physical"
 * @ejb.finder
 * 	description="Obtem todos elementos da tabela fazendo um like com o código do programa e descricao"
 * 	signature="java.util.Collection findByFields(java.lang.String codigo)"
 * 	unchecked="true"
 * 	query="SELECT OBJECT(obj) FROM programa as obj where obj.codigo LIKE ?1"
 * @ejb.finder
 * 	description="Obtem todos os elementos da tabela"
 * 	signature="java.util.Collection findAll()"
 * 	unchecked="true"
 * 	query="SELECT OBJECT(obj) FROM programa as obj"
 * @ejb.interface
 * 	 remote-package="com.seguranca.remote"
 * 	 local-package="com.seguranca.local"
 * @ejb.home
 * 	 remote-package="com.seguranca.remote"
 * 	 local-package="com.seguranca.local"
 * @jboss.persistence
 * 	create-table="false"
 * 	datasource="java:/SegurancaInformixDS"
 * 	datasource-mapping="InformixDB"
 * 	pk-constraint="true"
 * @ejb.facade
 * 	jndi-name="ejb/ProgramaFacadeBean"
 * 	type="Stateless"
 * 	description="Façade para o bean ProgramaBean"
 */

public abstract class ProgramaBean extends BaseEntityBean implements EntityBean {



/**
 * The  ejbCreate method.
 * 
 * @ejb.create-method 
 */
public java.lang.String ejbCreate(String codigo, String descricao, Character situacao) throws javax.ejb.CreateException {

}

/**
 * The container invokes this method immediately after it calls ejbCreate.
 * 
 */
public void ejbPostCreate() throws javax.ejb.CreateException {
}

/**
* Returns the codigo
* @return the codigo
* 
* @ejb.persistent-field 
* @ejb.persistence
*    column-name="prg_codigo"
*     sql-type="varchar"
* @ejb.pk-field 
* @ejb.interface-method
* 
* 
*/
public abstract java.lang.String getCodigo();

/**
* Sets the codigo
* 
* @param java.lang.String the new codigo value
* 
* @ejb.interface-method
*/
public abstract void setCodigo(java.lang.String codigo);

/**
* Returns the descricao
* @return the descricao
* 
* @ejb.persistent-field 
* @ejb.persistence
*    column-name="prg_descricao"
*     sql-type="varchar"
*  
* @ejb.interface-method
* 
*/
public abstract java.lang.String getDescricao();

/**
* Sets the descricao
* 
* @param java.lang.String the new descricao value
* 
* @ejb.interface-method
*/
public abstract void setDescricao(java.lang.String descricao);

/**
* Returns the situacao
* @return the situacao
* 
* @ejb.persistent-field 
* @ejb.persistence
*    column-name="prg_situacao"
*     sql-type="varchar"
*  
* @ejb.interface-method
* 
*/
public abstract Character getSituacao();

/**
* Sets the situacao
* 
* @param java.lang.String the new situacao value
* 
* @ejb.interface-method
*/
public abstract void setSituacao(Character situacao);

/**
 * @ejb.interface-method
 *	view-type="local" 
 **/
public ProgramaData getData(){ 
	return new ProgramaData(getCodigo(), getDescricao(), getSituacao()); 
}

/**
 * Apagar o entity
 * 
 */
public void ejbRemove() throws RemoveException{ }

7 Respostas

Paulo_Silveira

Sidney
joga fora o throws do ejbRemove

S

Paulo,

Ja tentei isso mas não posso tirar o throws do ejbRemove pois o Xdoclet gera uma classe chamada xxxxxCMP com o método abaixo:

/**
 * Método abaixo foi gerado pelo XDOCLET
 **/
public void ejbRemove() throws javax.ejb.RemoveException {
      super.ejbRemove();
}

Essa classe gerada tem uma herança do meu Bean portanto da erro de compilação se o meu método não tem o throws igual o da classe herdada.

Não tenho idéia do que fazer ainda

valeu!!!

Paulo_Silveira

pelo que o jboss esta falando, esta parecendo que ele tem um metodo home declarado que naor ecebe nada na sua interface home, e isso eh errado, pq ele recebe um Object, e isso ja vem escrito na itnerface EJBHome.

eh algum erro bobo que nao estamos vendo

coloque as classes geradas pelo Xdoclet. interfaces, digo.

S

Com certeza deve ser algo bem bobo pois não vi ninguem na net comentando isso.

Para aparecer os métodos remove nas classes geradas eu coloquei as tags XDOCLET no método ejbRemove:

/**
 * Apagar o entity
 * @ejb.interface-method
 *		view-type="local"
 * @ejb.home-method 
 * 	view-type = "local"
 */
public void ejbRemove() throws RemoveException { }
}

Colocando ou não colocando as tags no métodos, quando faço o deploy, o erro é o mesmo. Até ja descompactei o .jar colocado no JBOSS pra ver se esta mandando alguma classse errada ou coisas assim… olha o ponto que cheguei… :?

Programa

public interface Programa extends javax.ejb.EJBObject {
    // Todos os seteres e geteres do bean
}

ProgramaHome

public interface ProgramaHome extends javax.ejb.EJBHome {

   public static final String COMP_NAME="java:comp/env/ejb/Programa";
   public static final String JNDI_NAME="${app.name}/ProgramaBean";

   public com.seguranca.remote.Programa create(java.lang.String codigo , java.lang.String descricao , java.lang.Character situacao) 
      throws javax.ejb.CreateException,java.rmi.RemoteException;

   public java.util.Collection findByFields(java.lang.String codigo)
      throws javax.ejb.FinderException,java.rmi.RemoteException;

   public java.util.Collection findAll()
      throws javax.ejb.FinderException,java.rmi.RemoteException;

   public com.seguranca.remote.Programa findByPrimaryKey(java.lang.String pk)
      throws javax.ejb.FinderException,java.rmi.RemoteException;

   public void remove()
      throws javax.ejb.RemoveException, java.rmi.RemoteException;
}

ProgramaLocal

public interface ProgramaLocal extends javax.ejb.EJBLocalObject {
    // Todos os seteres e geteres do bean

   public com.seguranca.ejb.ProgramaData getData(  ) ;

   public void ejbRemove(  ) throws javax.ejb.RemoveException;

}

ProgramaLocalHome

public interface ProgramaLocalHome extends javax.ejb.EJBLocalHome {
   public static final String COMP_NAME="java:comp/env/ejb/ProgramaLocal";
   public static final String JNDI_NAME="ProgramaLocal";

   public com.seguranca.local.ProgramaLocal create(java.lang.String codigo , java.lang.String descricao , java.lang.Character situacao)
      throws javax.ejb.CreateException;

   public java.util.Collection findByFields(java.lang.String codigo)
      throws javax.ejb.FinderException;

   public java.util.Collection findAll()
      throws javax.ejb.FinderException;

   public com.seguranca.local.ProgramaLocal findByPrimaryKey(java.lang.String pk)
      throws javax.ejb.FinderException;

   public void remove() throws javax.ejb.RemoveException;

}

VALEU PELA FORÇA!

Paulo_Silveira
/** 
* Apagar o entity 
* @ejb.interface-method 
*      view-type="local" 
* @ejb.home-method 
*    view-type = "local" 
*/ 
public void ejbRemove() throws RemoveException { }

sidney, o ejbRemove eh soh um toque que o container vai te dar antes
de remover seu EB, se ele for CMP. entao ele nao deve ser xdocleado.

se vc poe xdoclet nele, pode ver que aparece esse metodo:
public void ejbRemove( ) throws javax.ejb.RemoveException;
nas interfaces Objects, que nao faz sentido algum.

esse eh um dos problemas, o outro eh que esta aparecendo um remove() sendo gerado na sua Home, que nao faz sentido, ja que voce ta extendendo Home e la ja tem o remove certo (dois alias). a questao eh descobrir porque ele ta gerando esse remove na Home, que ai o problema acaba.

S

Pois é, se eu desxdocletizar (boa palavra essa!) o método ejbRemove, o XDOCLET não gera nenhum método remove em nenhuma interface. Acho que é isso que você quis dizer que é o certo, não?

Mesmo assim o deploy não funciona. O mesmo erro simpático aparece!!

To perdido!!!

:?:

S

Bom, acho que chegamos em uma explicação viável para o erro.

O negócio é o seguinte, quem estiver começando com J2EE + XDOCLET como eu, não se meta a usar tags que podem ser descartadas. exemplo:

* @ejb.interface
*     remote-package="com.seguranca.remote"
*     local-package="com.seguranca.local"
* @ejb.home
*     remote-package="com.seguranca.remote"
*     local-package="com.seguranca.local"

Todo esse erro que eu estou tendo é culta dessas 6 linhas de código!!! Quando eu tiro funciona, quando eu coloco não funciona. Fiz isso umas tres vezes para ter certeza que o erro estava aí mesmo e realmente está. Agora a razão disso? não sei…

Valeu pela ajuda Paulo.

Boa sorte e bom trabalho para todos nós!

Criado 10 de março de 2004
Ultima resposta 11 de mar. de 2004
Respostas 7
Participantes 2