1

Restful Web サービスである非常に単純なクラスがあります。Web サービスで EJB を使用したい。@EJB アノテーションを使用して EJB を注入しました。唯一の問題は、EJB が常に null だったことです。次に、Web サービス自体をステートレス EJB にしました。これにより、ヌルの問題が修正されました。ただし、EJB で関数を呼び出そうとすると、次のエラーが発生します。

EVERE: EJB5070: ステートレス セッション Bean の作成中に例外が発生しました: [CasperLoggingDao]
警告: EJB5184: EJB CasperLoggingDao、メソッドの呼び出し中にシステム例外が発生しました: public boolean com.dv.model.dao.CasperLoggingDao.log(com.dv.model.entity.CasperLogMessage)
警告: javax.ejb.EJBException: javax.ejb.EJBException: javax.ejb.CreateException: ステートレス EJB を作成できませんでした
    com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:454) で
    com.sun.ejb.containers.BaseContainer.getContext(BaseContainer.java:2547) で
    com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:1899) で
    com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:212) で
    com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88) で
    $Proxy319.log で (不明なソース)
    com.dv.model.dao.__EJB31_Generated__CasperLoggingDao__Intf____Bean__.log (不明なソース) で
    com.dv.ws.casper.logging.CasperLoggingResource.putXml (CasperLoggingResource.java:64) で
    sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) で
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) で
    java.lang.reflect.Method.invoke(Method.java:601) で
    org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052) で
    org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124) で
    com.sun.ejb.containers.BaseContainer.invokeBeanMethod (BaseContainer.java:5388) で
    com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619) で
    com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800) で
    com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571)
    org.jboss.weld.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:42) で
    sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) で
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) で
    java.lang.reflect.Method.invoke(Method.java:601) で
    com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(Int) で
...

これは私のクラスです。log() を呼び出しているだけであることに注意してください。

@Stateless
@Path("casper/logging")
public class CasperLoggingResource {

private static final Logger logger = Logger.getLogger(CasperLoggingResource.class.getName());

@Context
private UriInfo context;

@EJB
private CasperLoggingDao casperLogger;

/**
 * Creates a new instance of GenericResource
 */
public CasperLoggingResource() {
}

/**
 * PUT method for updating or creating an instance of GenericResource
 * @param content representation for the resource
 * @return an HTTP response with content of the updated or created resource.
 */
@PUT
@Consumes("application/xml")
public void putXml(String content) {
    try
    {
        CasperLogMessage message = CasperLogMessageConverter.convertXMLToEntity(content);
        casperLogger.log(message);
    }
    catch(Exception e)
    {
        logger.log(Level.SEVERE, "Could not execute", e);
    }
}

}

以前はこれが機能していました。Restful Web サービスから EJB にアクセスするには、何か特別なことをする必要がありますか? 他のアイデアはありますか?

編集: CasperLoggingDao のコードは次のとおりです。

@Stateless
@LocalBean
public class CasperLoggingDao extends BaseDao<CasperLogMessage> {

private static final Logger logger = Logger.getLogger(CasperLoggingDao.class.getName());

public CasperLoggingDao()
{
    super(CasperLogMessage.class);
}

public CasperLoggingDao(EntityManager em)
{
    super(CasperLogMessage.class, em);
}


public boolean log(CasperLogMessage casperLogMessage)
{
    return create(casperLogMessage) != null;
}


}
4

1 に答える 1

0

あなたBaseDaoがそうするように呼びかけていると仮定しても安全ですかEntityManager

@PersistenceContext(unitName = "somePU") 
protected EntityManager entityManager;

@LocalBeanまた、 onは必要ありませんCasperLoggingDao。そして、あなたも必要@StatelessですBaseDao

于 2012-10-12T18:34:22.440 に答える