EJB LocalBean: Illegal non-business method access on no-interface view

0 respostas
G

Srs, tenho uma classe EJB que herda uma outra generic assim:

@Stateless
public abstract class AbstractJpaRepository<T, PK extends Serializable> {

    protected EntityManager getEntityManager() {
        return entityManager;
    }

    public T findByPK(PK pk) {
        return getEntityManager().find(getPersistentClass(), pk);
    }

    public void delete(PK pk) {
        T entity = getEntityManager().getReference(getPersistentClass(), pk);
        delete(entity);
    }

    public void delete(T entity) {
        try {
            getEntityManager().remove(entity);
            getEntityManager().flush();
        } catch (PersistenceException e) {
            throw new PersistenceException(ExceptionConstants.MSG_FOREIGN_KEY);
        }
    }
}
@LocalBean
@Stateless
public class RateRepository
    extends AbstractJpaRepository<Rate, Long> {

}

Quando uso o Glassfish em modo standalone funciona tudo bem. Porém quando eu faço deploy em cluster e chamo o método delete recebo a seguinte exception:

A system exception occurred during an invocation on EJB RateServiceBean method public void cob.model.service.RateServiceBean.delete(java.lang.Long)
javax.ejb.EJBException: Illegal non-business method access on no-interface view
	at cob.model.repository.__EJB31_Generated__RateRepository__Intf____Bean__.getEntityManager(Unknown Source)
	at cob.model.repository.AbstractJpaRepository.delete(AbstractJpaRepository.java:143)
	at cob.model.service.RateServiceBean.delete(RateServiceBean.java:83)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052)
	at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124)
	at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5363)
	at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619)
	at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88)
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:57)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)

Qual a diferença do método getEntityManager ser protected/public quando rodo em cluster? Se eu passo o método para public funciona. O mais estranho ainda é que há outros métodos que chamam o getEntityManager mas que não possuem esse problema. Apenas o método delete que dá esse erro.

Criado 22 de outubro de 2010
Respostas 0
Participantes 1