[RESOLVIDO] Problema em EJB ao retornar objeto recuperado do banco

Olá.

Sou novo em EJB, estou engatinhando. Fiz uma aplicação de teste, sendo um EJB assim:

@Remote
@Stateless
public class UsuarioBean implements UsuarioRemote {
	@PersistenceContext(unitName="MeuPU")
	private EntityManager em;

	(...)

	@Override
	public QualquerCoisa retornaQualquerCoisa() {
		QualquerCoisa t = null;
		try {
			t = em.find(QualquerCoisa.class, 1);
		} catch(Exception e) {
			e.printStackTrace();
		}
		return t;
	}
}

Estou rodando isso num Glassfish. O banco é MySQL e o objeto retorna certinho.
E no cliente eu chamo assim:

	Properties prop = new Properties();
	prop.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory");
	prop.put(Context.URL_PKG_PREFIXES, "com.sun.enterprise.naming");
	prop.put(Context.STATE_FACTORIES, "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
	InitialContext ic = new InitialContext(prop);
	UsuarioRemote ur = (UsuarioRemote) ic.lookup("java:global/ProjetoEJB/UsuarioBean!br.com.financero.ejb.UsuarioRemote");
	System.out.println(ur.retornaQualquerCoisa());

Quando rodo, retorna o seguinte erro:

31/08/2011 20:16:05 com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator handleFullLogging
AVISO: IOP00810011: Exception from readValue on ValueHandler in CDRInputStream
org.omg.CORBA.MARSHAL: AVISO: IOP00810011: Exception from readValue on ValueHandler in CDRInputStream  vmcid: OMG  minor code: 11 completed: Maybe
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:248)
	at com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:95)
	at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.handleFullLogging(WrapperGenerator.java:387)
	at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.access$400(WrapperGenerator.java:107)
	at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator$2.invoke(WrapperGenerator.java:511)
	at com.sun.corba.ee.spi.orbutil.proxy.CompositeInvocationHandlerImpl.invoke(CompositeInvocationHandlerImpl.java:99)
	at $Proxy24.valuehandlerReadException(Unknown Source)
	at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.readRMIIIOPValueType(CDRInputStream_1_0.java:1022)
	at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:1123)
	at com.sun.corba.ee.impl.encoding.CDRInputObject.read_value(CDRInputObject.java:531)
	at com.sun.corba.ee.impl.presentation.rmi.DynamicMethodMarshallerImpl$14.read(DynamicMethodMarshallerImpl.java:384)
	at com.sun.corba.ee.impl.presentation.rmi.DynamicMethodMarshallerImpl.readResult(DynamicMethodMarshallerImpl.java:483)
	at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:203)
	at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
	at com.sun.corba.ee.impl.presentation.rmi.codegen.CodegenStubBase.invoke(CodegenStubBase.java:227)
	at br.com.financero.ejb.__UsuarioRemote_Remote_DynamicStub.retornaQualquerCoisa(br/com/financero/ejb/__UsuarioRemote_Remote_DynamicStub.java)
	at br.com.financero.ejb._UsuarioRemote_Wrapper.retornaQualquerCoisa(br/com/financero/ejb/_UsuarioRemote_Wrapper.java)
	at idiota.Teste.main(Teste.java:30)
Caused by: java.lang.NullPointerException
	at com.sun.corba.ee.impl.orbutil.ClassInfoCache$ClassInfo.<init>(ClassInfoCache.java:156)
	at com.sun.corba.ee.impl.orbutil.ClassInfoCache.get(ClassInfoCache.java:281)
	at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:1097)
	at com.sun.corba.ee.impl.encoding.CDRInputObject.read_value(CDRInputObject.java:531)
	at com.sun.corba.ee.impl.io.IIOPInputStream.inputObjectField(IIOPInputStream.java:2162)
	at com.sun.corba.ee.impl.io.IIOPInputStream.inputClassFields(IIOPInputStream.java:2404)
	at com.sun.corba.ee.impl.io.IIOPInputStream.inputObject(IIOPInputStream.java:1224)
	at com.sun.corba.ee.impl.io.IIOPInputStream.simpleReadObject(IIOPInputStream.java:425)
	at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValueInternal(ValueHandlerImpl.java:308)
	at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:274)
	at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.readRMIIIOPValueType(CDRInputStream_1_0.java:1015)
	... 10 more
javax.ejb.EJBException: java.rmi.MarshalException: CORBA MARSHAL 1330446347 Maybe; nested exception is: 
	org.omg.CORBA.MARSHAL: AVISO: IOP00810011: Exception from readValue on ValueHandler in CDRInputStream  vmcid: OMG  minor code: 11 completed: Maybe
	at br.com.financero.ejb._UsuarioRemote_Wrapper.retornaQualquerCoisa(br/com/financero/ejb/_UsuarioRemote_Wrapper.java)
	at idiota.Teste.main(Teste.java:30)
Caused by: java.rmi.MarshalException: CORBA MARSHAL 1330446347 Maybe; nested exception is: 
	org.omg.CORBA.MARSHAL: AVISO: IOP00810011: Exception from readValue on ValueHandler in CDRInputStream  vmcid: OMG  minor code: 11 completed: Maybe
	at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.mapSystemException(Util.java:267)
	at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:213)
	at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
	at com.sun.corba.ee.impl.presentation.rmi.codegen.CodegenStubBase.invoke(CodegenStubBase.java:227)
	at br.com.financero.ejb.__UsuarioRemote_Remote_DynamicStub.retornaQualquerCoisa(br/com/financero/ejb/__UsuarioRemote_Remote_DynamicStub.java)
	... 2 more
Caused by: org.omg.CORBA.MARSHAL: AVISO: IOP00810011: Exception from readValue on ValueHandler in CDRInputStream  vmcid: OMG  minor code: 11 completed: Maybe
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:248)
	at com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:95)
	at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.handleFullLogging(WrapperGenerator.java:387)
	at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.access$400(WrapperGenerator.java:107)
	at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator$2.invoke(WrapperGenerator.java:511)
	at com.sun.corba.ee.spi.orbutil.proxy.CompositeInvocationHandlerImpl.invoke(CompositeInvocationHandlerImpl.java:99)
	at $Proxy24.valuehandlerReadException(Unknown Source)
	at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.readRMIIIOPValueType(CDRInputStream_1_0.java:1022)
	at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:1123)
	at com.sun.corba.ee.impl.encoding.CDRInputObject.read_value(CDRInputObject.java:531)
	at com.sun.corba.ee.impl.presentation.rmi.DynamicMethodMarshallerImpl$14.read(DynamicMethodMarshallerImpl.java:384)
	at com.sun.corba.ee.impl.presentation.rmi.DynamicMethodMarshallerImpl.readResult(DynamicMethodMarshallerImpl.java:483)
	at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:203)
	... 5 more
Caused by: java.lang.NullPointerException
	at com.sun.corba.ee.impl.orbutil.ClassInfoCache$ClassInfo.<init>(ClassInfoCache.java:156)
	at com.sun.corba.ee.impl.orbutil.ClassInfoCache.get(ClassInfoCache.java:281)
	at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:1097)
	at com.sun.corba.ee.impl.encoding.CDRInputObject.read_value(CDRInputObject.java:531)
	at com.sun.corba.ee.impl.io.IIOPInputStream.inputObjectField(IIOPInputStream.java:2162)
	at com.sun.corba.ee.impl.io.IIOPInputStream.inputClassFields(IIOPInputStream.java:2404)
	at com.sun.corba.ee.impl.io.IIOPInputStream.inputObject(IIOPInputStream.java:1224)
	at com.sun.corba.ee.impl.io.IIOPInputStream.simpleReadObject(IIOPInputStream.java:425)
	at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValueInternal(ValueHandlerImpl.java:308)
	at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:274)
	at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.readRMIIIOPValueType(CDRInputStream_1_0.java:1015)
	... 10 more

No console do servidor nenhum erro aparece, apenas o select do hibernate.
Se eu em vez de buscar o objeto no banco instanciar ele ali no EJB e retornar, não ocorre erro algum.

Alguem poderia me ajudar? Desde já, obrigado.

Ninguém? :cry:

Tentou este link?
http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html

Valeu a resposta.

Tentei sim, foi seguindo exatamente os tutoriais desse link que eu configurei o meu lookup do cliente EJB… =/

Descobri uma coisa…

A classe que eu estou retornando é basicamente:

[code]
@Entity
public class QualquerCoisa implements Serializable {
private static final long serialVersionUID = 1L;

@Id
protected int id;
protected String nome;
@ManyToOne(fetch = FetchType.EAGER)
protected QualquerCoisa qualquerMestre;
@OneToMany(mappedBy="qualquerMestre",fetch = FetchType.EAGER)
protected List<QualquerCoisa> lista;

(...)

}[/code]

Eu fiz uma referência para ela mesma para fazer uns testes…
Se eu comentar as linhas referentes aos campos qualquerMestre e lista (com suas anotações, claro) o erro some.

Alguma ideia?

Na internet achei a seguinte “solução”:

[quote]The solution is to compile the client java files by using any jar files from the remote server not the local one.

Then any standalone client will run correctly when calling a remote server/machine application.[/quote]

Como assim compilar os .java do cliente usando arquivos jar do servidor remoto ao invés da máquina local? Alguém sabe explicar melhor?

Desde já, obrigado.

Você tem que colocar as interfaces remotas no classpath do seu cliente.

Eu estou gerando um JAR com todos os beans e interfaces que preciso e jogando pra aplicação cliente. Já está tudo no classpath… que eu saiba…

Obrigado pela ajuda, eu descobri o problema.

Meu objeto carregava uma lista que era obtida do banco via hibernate. Essa lista (um java.util.List) o hibernate setava com um org.hibernate.collection.PersistentBag. Se eu setava ela para null antes de retornar, funcionava.

Então eu conclui o óbvio: meu cliente precisava conhecer a classe org.hibernate.collection.PersistentBag.
Então tomei a atitude óbvia: adicionei os jars necessários do hibernate ao meu cliente.

Funcionou tão bonito que chega a dar nojo. Valeu.