3

展開の問題を回避するために、これらの両方のインターフェイスを実装する必要がある理由を理解しようとしています。

Java コード

ExamplePlanAssembler.java

@Local
public interface ExamplePlanAssembler {
   ExamplePlan toBO(ExamplePlanEntity entity);
}

ExtendedExamplePlanAssembler.java

@Local
public interface ExtendedExamplePlanAssembler 
extends ExamplePlanAssembler{
   ExtExamplePlan toBO(ExamplePlanEntity entity, ExtExamplePlanEntity extEntity);
}

ExtendedExamplePlanAssemblerImpl.java

@Stateless
public class ExtendedExamplePlanAssemblerImpl 
implements ExtendedExamplePlanAssembler {
   /* Method impls removed */
}

ExamplePlanServiceImpl.java

@Stateless
public class ExamplePlanServiceImpl 
implements ExamplePlanService {
   private ExamplePlanAssembler examplePlanAssembler ;
   @EJB
   public void setAssembler(ExamplePlanAssembler examplePlanAssembler) {
       this.examplePlanAssembler = examplePlanAssembler;
    }
}

展開エラー

[#|.507-0500|SEVERE|gf3.1.2|javax.enterprise.system.tools.deployment.org.glassfish.deployment.common
|_ThreadID=83;_ThreadName=Thread-7;|Cannot resolve reference Local ejb-ref name=
com.myco.services.business.ExampleServiceImpl/examplePlanAssembler,Local 3.x interface =
com.myco.services.assembly.ExamplePlanAssembler,ejb-link=null,lookup=,mappedName=,jndi-name=,refType=Session|#]

[#|.508-0500|SEVERE|gf3.1.2|javax.enterprise.system.core.com.sun.enterprise.v3.server
|_ThreadID=83;_ThreadName=Thread-7;|Exception while deploying the app [mycoservicesear]|#]

[#|.508-0500|SEVERE|gf3.1.2|javax.enterprise.system.core.com.sun.enterprise.v3.server
|_ThreadID=83;_ThreadName=Thread-7;|Cannot resolve reference Local ejb-ref name=
com.myco.services.business.ExampleServiceImpl/examplePlanAssembler,Local 3.x interface =
com.myco.services.assembly.ExamplePlanAssembler,ejb-link=null,lookup=,mappedName=,jndi-name=,refType=Session
java.lang.RuntimeException: Cannot resolve reference Local ejb-ref name=
com.myco.services.business.ExampleServiceImpl/examplePlanAssembler,Local 3.x interface =
com.myco.services.assembly.ExamplePlanAssembler,ejb-link=null,lookup=,mappedName=,jndi-name=,refType=Session


[#|.516-0500|SEVERE|gf3.1.2|javax...gf.deployment.admin
|_ThreadID=83;_ThreadName=Thread-7;|Exception while deploying the app [mycoservicesear] : Cannot resolve reference Local ejb-ref name=
com.myco.services.business.ExampleServiceImpl/examplePlanAssembler,Local 3.x interface =
com.myco.services.assembly.ExamplePlanAssembler,ejb-link=null,lookup=,mappedName=,jndi-name=,refType=Session|#]

修正?

ExtendedExamplePlanAssemblerインターフェイスだけでなく、親インターフェイスも実装するようにインターフェイス impl を変更するExamplePlanAssemblerと、デプロイ エラーが表示されなくなります。

ExtendedExamplePlanAssemblerImpl.java (v2)

@Stateless
public class ExtendedExamplePlanAssemblerImpl 
implements ExtendedExamplePlanAssembler,  ExamplePlanAssembler{
   /* Method impls removed */
}

質問

implements宣言に親インターフェイスを追加すると、展開の問題が解決するのはなぜですか?

4

2 に答える 2

4

EJB仕様はそう言っています、

たとえば、特定のセッション Bean によって公開されるクライアント ビューは、たまたまセッション Bean を定義するサブクラスによって継承されません。

@Stateless
public class A implements Foo { ... }
@Stateless
public class B extends A implements Bar { ... }

Foo と Bar がローカル ビジネス インターフェースであり、関連付けられたデプロイメント記述子がないと仮定すると、セッション Bean A はローカル ビジネス インターフェース Foo を公開し、セッション Bean B はローカル ビジネス インターフェース Bar を公開しますが、Foo は公開しません。

ここを参照してください。EJB3.1 仕様のセクション 4.9.2.1

于 2012-10-11T13:09:06.280 に答える