1

次の環境 (Java EE、EJB、および WAR モジュールを含む環境) でエンタープライズ アプリケーションを作成しようとしています。私はこれらの手順に従っています (Web アプリケーションに関するものではありませんが、Web アプリケーションに関する記事は見つかりませんでした)。

  • NetBeans 7.2.1
  • Glassfish Server 3.1.2 (サーブレット 3.0 API を含む)
  • EJB 3.1
  • JPA2.0
  • JSF2.1
  • オラクル10g

クラス ライブラリ ([新しいプロジェクト] -> [Java] -> [Java クラス ライブラリ]) を作成javax.ejb.Remoteして、ステートレス セッション Bean によって実装されるリモート ( ) インターフェイスを配置しました。クラス ライブラリは、両方のモジュール (EJB と WAR) のクラス パスに追加されています。

このアプリケーションを実行しようとすると、次の例外が発生します。

com.sun.faces.mgbean.ManagedBeanCreationException: An error occurred performing resource injection on managed bean transporterBean
        at com.sun.faces.mgbean.BeanBuilder.injectResources(BeanBuilder.java:211)
        at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:103)
        at com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409)
        at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269)
        at com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:244)
        at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:116)
        at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
        at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
        at com.sun.el.parser.AstIdentifier.getValue(AstIdentifier.java:103)
        at com.sun.el.parser.AstValue.getValue(AstValue.java:179)
        at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:224)
        at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
        at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
        at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
        at javax.faces.component.UIData.getValue(UIData.java:731)
        at javax.faces.component.UIData.getDataModel(UIData.java:1798)
        at javax.faces.component.UIData.setRowIndexWithoutRowStatePreserved(UIData.java:484)
        at javax.faces.component.UIData.setRowIndex(UIData.java:473)
        at com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:81)
        at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:820)
        at javax.faces.component.UIData.encodeBegin(UIData.java:1118)
        at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1755)
        at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
        at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
        at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)
        at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
        at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
        at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
        at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
        at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
        at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
        at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
        at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
        at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
        at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
        at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
        at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
        at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
        at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
        at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
        at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
        at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
        at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
        at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
        at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
        at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
        at java.lang.Thread.run(Thread.java:722)
Caused by: com.sun.faces.spi.InjectionProviderException: com.sun.enterprise.container.common.spi.util.InjectionException: Exception attempting to inject Remote ejb-ref name=managedbeans.TransporterBean/adminSessionBeanRemote,Remote 3.x interface =admin.sessionbeans.AdminSessionBeanRemote,ejb-link=null,lookup=,mappedName=,jndi-name=admin.sessionbeans.AdminSessionBeanRemote,refType=Session into class managedbeans.TransporterBean: Lookup failed for 'java:comp/env/managedbeans.TransporterBean/adminSessionBeanRemote' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming}
        at org.glassfish.faces.integration.GlassFishInjectionProvider.inject(GlassFishInjectionProvider.java:194)
        at com.sun.faces.mgbean.BeanBuilder.injectResources(BeanBuilder.java:205)
        ... 53 more
Caused by: com.sun.enterprise.container.common.spi.util.InjectionException: Exception attempting to inject Remote ejb-ref name=managedbeans.TransporterBean/adminSessionBeanRemote,Remote 3.x interface =admin.sessionbeans.AdminSessionBeanRemote,ejb-link=null,lookup=,mappedName=,jndi-name=admin.sessionbeans.AdminSessionBeanRemote,refType=Session into class managedbeans.TransporterBean: Lookup failed for 'java:comp/env/managedbeans.TransporterBean/adminSessionBeanRemote' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming}
        at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:703)
        at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.inject(InjectionManagerImpl.java:470)
        at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.injectInstance(InjectionManagerImpl.java:171)
        at org.glassfish.faces.integration.GlassFishInjectionProvider.inject(GlassFishInjectionProvider.java:184)
        ... 54 more
Caused by: javax.naming.NamingException: Lookup failed for 'java:comp/env/managedbeans.TransporterBean/adminSessionBeanRemote' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NamingException: Exception resolving Ejb for 'Remote ejb-ref name=managedbeans.TransporterBean/adminSessionBeanRemote,Remote 3.x interface =admin.sessionbeans.AdminSessionBeanRemote,ejb-link=null,lookup=,mappedName=,jndi-name=admin.sessionbeans.AdminSessionBeanRemote,refType=Session' .  Actual (possibly internal) Remote JNDI name used for lookup is 'admin.sessionbeans.AdminSessionBeanRemote#admin.sessionbeans.AdminSessionBeanRemote' [Root exception is javax.naming.NamingException: Lookup failed for 'admin.sessionbeans.AdminSessionBeanRemote#admin.sessionbeans.AdminSessionBeanRemote' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: admin.sessionbeans.AdminSessionBeanRemote#admin.sessionbeans.AdminSessionBeanRemote not found]]]
        at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518)
        at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455)
        at javax.naming.InitialContext.lookup(InitialContext.java:411)
        at javax.naming.InitialContext.lookup(InitialContext.java:411)
        at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:599)
        ... 57 more
Caused by: javax.naming.NamingException: Exception resolving Ejb for 'Remote ejb-ref name=managedbeans.TransporterBean/adminSessionBeanRemote,Remote 3.x interface =admin.sessionbeans.AdminSessionBeanRemote,ejb-link=null,lookup=,mappedName=,jndi-name=admin.sessionbeans.AdminSessionBeanRemote,refType=Session' .  Actual (possibly internal) Remote JNDI name used for lookup is 'admin.sessionbeans.AdminSessionBeanRemote#admin.sessionbeans.AdminSessionBeanRemote' [Root exception is javax.naming.NamingException: Lookup failed for 'admin.sessionbeans.AdminSessionBeanRemote#admin.sessionbeans.AdminSessionBeanRemote' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: admin.sessionbeans.AdminSessionBeanRemote#admin.sessionbeans.AdminSessionBeanRemote not found]]
        at com.sun.ejb.EjbNamingReferenceManagerImpl.resolveEjbReference(EjbNamingReferenceManagerImpl.java:191)
        at com.sun.enterprise.container.common.impl.ComponentEnvManagerImpl$EjbReferenceProxy.create(ComponentEnvManagerImpl.java:1109)
        at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:776)
        at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:744)
        at com.sun.enterprise.naming.impl.JavaURLContext.lookup(JavaURLContext.java:169)
        at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:498)
        ... 61 more
Caused by: javax.naming.NamingException: Lookup failed for 'admin.sessionbeans.AdminSessionBeanRemote#admin.sessionbeans.AdminSessionBeanRemote' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: admin.sessionbeans.AdminSessionBeanRemote#admin.sessionbeans.AdminSessionBeanRemote not found]
        at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518)
        at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455)
        at javax.naming.InitialContext.lookup(InitialContext.java:411)
        at javax.naming.InitialContext.lookup(InitialContext.java:411)
        at com.sun.ejb.EjbNamingReferenceManagerImpl.resolveEjbReference(EjbNamingReferenceManagerImpl.java:186)
        ... 66 more
Caused by: javax.naming.NameNotFoundException: admin.sessionbeans.AdminSessionBeanRemote#admin.sessionbeans.AdminSessionBeanRemote not found
        at com.sun.enterprise.naming.impl.TransientContext.doLookup(TransientContext.java:248)
        at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:215)
        at com.sun.enterprise.naming.impl.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:77)
        at com.sun.enterprise.naming.impl.LocalSerialContextProviderImpl.lookup(LocalSerialContextProviderImpl.java:119)
        at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:505)
        ... 70 more

リモートインターフェイスは次のとおりです。

 package admin.sessionbeans;

import entities.Transporter;
import java.util.List;
import javax.ejb.Remote;

@Remote(AdminSessionBeanRemote.class)
public interface AdminSessionBeanRemote 
{
    public List<Transporter> getAllTransporters(); 
}

ステートレス セッション Bean。

package admin.sessionbeans;

import entities.Transporter;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless//(mappedName="adminSessionBean")
public class AdminSessionBean implements AdminSessionBeanRemote {

    @PersistenceContext(unitName="wagafashion-ejbPU")
    private EntityManager entityManager;

    @Override
    public List<Transporter> getAllTransporters() 
    {
        return entityManager.createNamedQuery("Transporter.findAll").getResultList();
    }
}

JSF マネージド Bean。

package managedbeans;

import admin.sessionbeans.AdminSessionBeanRemote;
import entities.Transporter;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean
@RequestScoped
public final class TransporterBean 
{
    @EJB
    private AdminSessionBeanRemote adminSessionBeanRemote;
    private List<Transporter>transporters;

    public TransporterBean() 
    {

    }

    public List<Transporter> getTransporters()
    {
        transporters=adminSessionBeanRemote.getAllTransporters();
        return transporters;
    }

    public void setTransporters(List<Transporter> transporters) 
    {
        this.transporters = transporters;
    }
}

このコメントに従って、すべてのエンティティ クラスをクラス ライブラリに追加しました。

クライアント jar には、リモート インターフェイスと、これらのインターフェイスが依存するすべてのクラスが含まれている必要があります。


1 年ほど前、NetBeans 6.9.1 を使用していたとき、そのようなアプリケーションをいくつか開発しました。このバージョンの IDE では、リモート インターフェイスを別のクラス ライブラリに配置する必要はありません。

PC に NetBeans IDE 6.9.1 がまだインストールされていて、同じアプリケーションを作成しようとしました (別個のクラス ライブラリなしで、リモート インタフェースは同じ EJB モジュールにあります)。意図したとおりに動作しました。

最後に 1 つ: このクラス ライブラリを両方のモジュール (EJB と WAR) から削除し、Java EE モジュール (NetBeans では三角形で示されているモジュール) のみをデプロイすると、意図した機能が実行され、データベースからデータが取得されます。 JSF ページに表示されます。

そのため、この例外の原因について非常に混乱しており、欠落している可能性が高いのがクラス ライブラリの問題なのか、他の必要な構成によるものなのか、はっきりとは言えません (ただし、JNDI ルックアップがいくつかある可能性があります)。わからない問題)。


NetBeans 7.x でエンタープライズ Web アプリケーションを作成する方法に関するリンクがあれば、非常に役に立ちます。

4

1 に答える 1

2

コードの問題の1つは、@Remoteアノテーションにクラス名が含まれていることです。私は非常に興味があります、なぜあなたはそれをそこに置く必要性を感じたのですか?

いずれにせよ、@ Remoteを使用してリモートインターフェイスをマークする場合は存在しないはずであり、確実に削除する必要があります。

さらに、同じJVM内に注入する場合は、@ Localインターフェースを使用するか、インターフェースをまったく使用しないでください(ローカルセマンティクスがあります)。つまり、メソッドが呼び出されて何かを返すたびに、戻り値をマーシャリング(シリアル化/ディープコピー)していることになります。これらのセマンティクスが必要ない場合、それはかなり無駄です。

于 2013-02-26T09:37:56.420 に答える